请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:一种是用HashMap存,键存原链表,值存新链表,然后再跑原链表一遍,把random加上。第二种是将原链表的每个节点后面加一个复制的节点,然后把random加上,再把两根链表拆开。最开始的时候我以为复制出来就行了,最后发现原链表也得不动,这块耗时较长,我还以为我的代码错了呢。

/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;

public Node(int val) {this.val = val;this.next = null;this.random = null;
}

}
*/
class Solution {
public Node copyRandomList(Node head) {
if(head == null){
return null;
}
//将链表复制一份
for(Node p = head, newNode = null;p != null;p = p.next.next){
newNode = new Node(p.val);
newNode.next = p.next;
p.next = newNode;
}
//把随机指针也拉上
for(Node p = head;p != null;p = p.next.next){
if(p.random != null){
p.next.random = p.random.next;
}
}
//拆分链表,原链表还不能变,一开始一直是直接拉出复制链来发现过不老
return split(head);
}

public static Node split(Node head){Node h = head.next;Node p = head;Node q = head.next;while(p != null && q != null){p.next = q.next;p = q;q = q.next;}return h;
}

}

面试题35. 复杂链表的复制相关推荐

  1. 剑指offer:面试题35. 复杂链表的复制

    题目:复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 ...

  2. 剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)

    题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  3. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

  4. 剑指 Offer 35. 复杂链表的复制

    剑指 Offer 35. 复杂链表的复制 题目 题目链接 解题思路 题目理解 解题思路 具体代码 题目 题目链接 https://leetcode-cn.com/problems/fu-za-lian ...

  5. 【三次优化】剑指 Offer 35. 复杂链表的复制

    立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...

  6. 剑指offer——35复杂链表的复制

    这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...

  7. 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

    题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  8. LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...

  9. 35. 复杂链表的复制

    链接 https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 难度: #中等 题目 请实现 copyRandomList 函数 ...

最新文章

  1. C#程序调用外部程序
  2. 牛客假日团队赛5 K 金币馅饼 (DP 基础题)
  3. 高考还没结束,这份试卷已经流出,你能拿多少分?
  4. python图片矢量化_图像处理tas的Python矢量化
  5. 树莓派4B安装Ubuntu20.04
  6. SQL Server 2008支持将数据导出为脚本
  7. 冒泡排序c语言(包含完整代码)
  8. 21天学通java web 第二版pdf_21天学通JAVA WEB开发 pdf完全版_IT教程网
  9. linux64 gaussian 16,Gaussian 16 运行与硬件配置参考
  10. word转简洁html工具,Convert Word to HTML(Word转HTML工具)
  11. 大数据入门教程系列之Hbase安装(伪分布式)
  12. C++ 分配器 allocator
  13. python while循环详解
  14. 构建具有时间依存协变量的Elastic-net Cox模型
  15. GPS北斗卫星时钟同步系统的原理和技术
  16. 【科普】如何评价供应商的MES系统
  17. 在windows终端中进行复制粘贴的方法
  18. antd table合并行或者列(动态添加合并行、列)
  19. 机器学习在神策数据的应用
  20. 年度结转的时候,弹出“系统所用科目被删除,不能结转上年度数据”

热门文章

  1. 华为林成海:大数据让企业更智慧
  2. 自动生成艾宾浩斯记忆规律背单词时间表的Matlab脚本
  3. 零基础学Java语言(浙江大学) 第六周 编程题
  4. 浙大计算机教授闹不植入芯片,浙江大学正式宣布:“意念”控制,不再是传说...
  5. 模拟器pubg mobile服务器维修,pubg mobile参数模拟器
  6. QtQuick资源文件问题
  7. 【投影仪】投影仪相关知识及参数科普
  8. MPAndroidChart 运动数据图表自定义
  9. 您在w3schools上没有学过的XSLT技巧
  10. survivor区的解释