js 链路表和反向链路

发布时间 2023-07-01 11:12:03作者: 浅唱年华1920

 

/**
 *  数组转链路表数据 - {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;
}