/** * 数组转链路表数据 - {value: A, next: {value: B, next: {value: C}} * @param {*} list arr * @returns */ function createLink(list) { let length = list.length; // 最后一级,没有next let currNode = { value: list[length - 1], }; // [1,2,3,4,5]; //4.next = 5, 5没有下一级 // 从最后二个元素反向遍历,倒数第二元素的next 就是 上面的currNode, 然后当前对象重新赋值给 外面的currNode,依次遍历完, // 倒数第二next 是最后一级,倒数第三next 是倒数第二,依次类推 for(let i = length - 2; i >= 0; i --) { currNode = { value: list[i], next: currNode } } return currNode; }
/** * 反向链表 把 {value: A, next: {value: B, next: {value: C}}, ---> 转成 {value: C, next: {value: B, next: {value: A}} * * @param {*} data object */ function unLink(data) { let currNode; let preNode; let nextNode = data; while (nextNode) { // 第一层级的时候,删掉next, 因为数据转换出来,第一层级是最后一级,没有next,且会造成循环引用 if (!preNode && currNode) { delete currNode.next; } // currNode if (currNode && preNode) { currNode.next = preNode; } /** 数据移动规则 [p = c; c = n; n = c.next] p: preNode, c:currNode, n: nextNode * A B C * p c n 第一轮完 p 是空的, c = A, n = B * p c n 第二轮 的时候 [p 是空的 && c 有值,这个时候删除 c.next], 完的时候 p c 都有值 * p c n 第三轮 开始, p c 都有值, 把 p 的值 赋值给 c.next, 因为数据反转的时候 c 是p的父级, * 然后后面 继续 c.next 里面是 p, c 重新赋值给p, c 再拿到最新的值,p 再次赋值给 c.next */ preNode = currNode; currNode = nextNode; nextNode = currNode?.next; } currNode.next = preNode return currNode; }