最近始终在钻研链表相干的构造,突发奇想实现一下相似数组的entries性能
先贴链表的代码,以单向链表为例
定义
链表存储有序的元素汇合,但不同于数组,链表中的元素在内存中并不是间断搁置的。
每个 元素由一个存储元素自身的节点和一个指向下一个元素的援用(也称指针或链接)组成。
下图展 示了一个链表的构造。
链表节点的类
class Node { constructor(value) { this.value = value; this.next = null; }}
链表实现类
class LinkList { constructor() { this.head = null; this.count = 0; } push(val) { const node = new Node(val); if (this.head == null) { this.head = node; } else { let current = this.head; while (current.next != null) { current = current.next; } current.next = node; } this.count++; return this.count; } removeAt(index) { if (index >= 0 && index < this.count) { let head = this.head; if (index === 0) { this.head = head.next; } else { // 上一个 let prev = this.getElementAt(index - 1); let current = prev.next; prev.next = current.next; } this.count--; return head.value; } return undefined; } getElementAt(index) { if (index >= 0 && index < this.count) { let current; if (index === 0) { current = this.head; } else { current = this.head; for (let i = 0; i < index; i++) { current = current.next; } } return current; } return undefined; } insert(element, index) { if (index >= 0 && index < this.count) { let node = new Node(element) if (index === 0) { node.next = this.head; this.head = node; } else { // 上一个 let prev = this.getElementAt(index - 1); let next = prev.next; node.next = next; prev.next = node; } this.count++; return element; } return undefined; } indexOf(element) { let current = this.head; for (let i = 0; i < this.count; i++) { if (current.value === element) { return i; } current = current.next; } return undefined; } getHead() { return this.head; } remove(element) { const index = this.indexOf(element); this.removeAt(index); } isEmpty() { return this.size() === 0; } size() { return this.count; } toString() { let current = this.head; let str = `${current.value}`; for (let i = 1; i < this.count; i++) { current = current.next; str = `${str},${current.value}`; } return str; }}
以原型继承形式实现entries
LinkList.prototype.entries = function() { let current = this.head; const count = this.count; let selfCount = 0; return new function() { this.next = function() { if(selfCount > count || current == null) { return {value: undefined, done: true}; } let [index, value] = [selfCount, current.value]; selfCount++; let done = count === selfCount; current = current.next; return {index, value, done}; } }}
此处采纳闭包是为了获取链表构造的头节点与节点数量,返回构造函数来实现next办法
测试
let l = new LinkList();l.push(1);l.push(2);l.push(3);l.insert(1.5, 1)const item = l.entries();console.log(item.next())console.log(item.next())console.log(item.next())console.log(item.next())console.log(item.next())console.log(item.next())console.log(item.next())console.log(item.next())
此处针对数组返回做了一些改变,将index和value做了独自抽取