js 创建一条通用链表
javascript 开发需要「链表」吗?
图解链表
实现双向链表
·
·
JavaScript
1 2 3 4 5 6 7 | function generateNode(data) { return { data: data, // 数据域 next: null, // 前驱指针 prev: null // 后继指针 } } |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | let HEAD, TAIL, POINTER, length = 0; // 创建一条长度为5的双向链表 [0, 1, 2, 3, 4].forEach((data, index, arr) => { let node = generateNode(data); // 第一个节点 if(index === 0) { HEAD = node; } else { // 指定前驱后继指针 [node.prev, POINTER.next] = [POINTER, node]; // 最后一个节点 index === arr.length - 1 && (TAIL = node) } // 指向当前节点 POINTER = node; ++length; }); // 游标指针回退到头部 POINTER = HEAD; |
定制 APIs
Name | Detail | Name | Detail | Name | Detail | Name | Detail |
shift | 参见数组 | unshift | 参见数组 | pop | 参见数组 | push | 参见数组 |
slice | 参见数组 | splice | 参见数组 | concat | 参见数组 | reverse | 参见数组 |
sort | 参见数组 | indexOf | 参见数组 | length[属性] | 参见数组 | – | – |
at | 指针定位 | prev | 指针前移 | next | 指针后退 | curr | 当前指针 |
first | 头节点 | last | 尾节点 | remove | 删除节点 | clone | 克隆链表 |
insertAfter | 插入节点 | insertBefore | 插入节点 | insertChainAfter | 插入链表 | insertChainBefore | 插入链表 |
HEAD[属性] | 头指针 | TAIL[属性] | 尾指针 | setHead | 重置头指针 | setTail | 重置尾指针 |
POINTER[属性] | 游标指针(当前位置) | setPointer | 设置当前指针 | – | – | – | – |
循环链表
JavaScript
1 2 3 4 5 6 7 8 9 10 | Array.prototype.next = function() { var cur = this[0]; this.push(this.shift()); return cur; } var arr = [1, 2, 3, 4, 5]; var count = 0; while(count++<20) { console.log(arr.next()); } |
JavaScript
1 2 3 4 5 6 | let circle = new Chain([1, 2, 3, 4, 5]); // 链表头咬尾 circle.TAIL.next = circle.HEAD; for(let i = 0; i < 20; ++i) { console.log(chain.next()); } |