1. 首页

LeetCode 138. 复制带随机指针的链表

题目描述

难度:Middle

相关话题:哈希表链表

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

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

示例:

LeetCode 138. 复制带随机指针的链表

输入:{"$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

};

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:LeetCode 138. 复制带随机指针的链表

链接:https://www.javascriptc.com/4502.html

« Immutable 结构共享
LeetCode 137. 只出现一次的数字 II»
Flutter 中文教程资源

相关推荐

QR code