原文:138. 复制带随机指针的链表(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0138/

题目:

难度:Middle

相关话题:哈希表链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深拷贝

示例:

输入:{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}

解释:节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

提示:

  1. 你必须返回给定头的拷贝 作为对克隆列表的引用。

思路:

第一次遍历:在每一个节点后面添加一个val相同的节点copy

第二次遍历:对每一个节点添加random属性,copy.random = oldNode.random.next

第三次遍历:将copy单独提取出,删除原链表中的所有copy

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * // Definition for a Node.
 * function Node(val,next,random) {
 *    this.val = val;
 *    this.next = next;
 *    this.random = random;
 * };
 */
/**
 * @param {Node} head
 * @return {Node}
 */
var copyRandomList = function(head) {
  if(!head)return null
  let node=head
  while(node){
    let next=node.next
    let copy=new Node(node.val)
    node.next=copy
    copy.next=next
    node=next
  }
  node=head
  while(node){
    let next=node.next.next
    if(node.random){
      node.next.random=node.random.next
    }
    node=next
  }

  let copyHead=new Node()
  node=head
  let copyNode=copyHead
  while(node){
    let nxt=node.next.next
    let copy=node.next
    copyNode.next=copy
    node.next=nxt
    copyNode=copyNode.next
    node=nxt
  }
  return copyHead.next

};