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

方法一:暴力
先构建链表,然后再一个一个的找 random 指针所指向的结点

  • 时间复杂度O(n^2)
  • 空间复杂度O(1)

时间效率太差了,完全没有美感

方法二:空间换时间
用一个大小为 n 的 hash 表存储,用 O(n) 的空间把时间从 O(n^2) 降到 O(n)

方法三:同步复制
第一趟遍历构建复制结点,对链表中的每一个结点作一个复制,复制结点链接在当前结点之后,复制的结点的 next 为当前结点的下一个结点。

第二趟遍历,构建 random 指针,复制结点的 random 指针指向,当前结点 random 的下一个结点,同时断开当前结点和复制结点的链接,就可以得到深拷贝的复杂链表了。

  • 指针太乱了,可以多定义几个防止混淆和空指针判定
  • 时间复杂度O(n)
  • 空间复杂度O(1)
class Solution {public Node copyRandomList(Node head) {if (head == null ){return null;}Node curr = head;//拷贝链表,并且把链表连接起来while(curr != null){Node next = curr.next;Node copy = new Node(curr.val);curr.next = copy;copy.next = next;curr = next;}//指定随即指针curr = head;while(curr != null){Node next = curr.next.next;//原节点的下一个节点Node currCopy = curr.next;//当前的拷贝节点currCopy.random = curr.random!=null?curr.random.next:null;//指定随机指针节点curr = next;//当前节点指向下一个节点}//拆分链表curr = head;Node res = curr.next;//用于返回的拷贝头节点while (curr != null){Node next = curr.next.next;//原节点的下一个节点Node curCopy = curr.next;//拷贝节点curr.next = next;//将原节点指向下一个原节点curCopy.next = next!=null?next.next:null;//拷贝节点的下一个节点指向下一个原节点的下一个节点curr = next;//将当前节点指向下一个原节点}return res;}
}

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

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

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

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

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

  3. 面试题35. 复杂链表的复制

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 35. 复杂链表的复制

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

最新文章

  1. 爬虫网页搜索策略的选择
  2. 百度的智能办公平台来了!12岁百度Hi今天全面升级,让协作「如流」
  3. JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
  4. zoj 1438 - Asteroids!
  5. MySQL删除用户(DROP USER)
  6. 第十二节 VMware View 6.0 菜鸟入门 部署和安装2008 R2 RDS服务
  7. Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
  8. java system.load()_System.load()与System.loadLibrary()
  9. 一个简单的完成端口(服务端/客户端)类
  10. 【分布式】分布式架构-ESB SOA
  11. java定义一个二维数组
  12. MAC Nginx配置: open() “xxx/logs/error.log“ failed (2: No such file or direc
  13. MySQL 数据库之实现热备份
  14. Android 红外遥控器实现
  15. APP运营推广,如何做到“饱和攻击”
  16. 三种实现分布式锁的方式
  17. 利用python获取自己的qq群成员信息!
  18. 携手企业创新 共创美好未来——低代码助力企业数字化
  19. 工业机器人(5)-串口通信技术与MODBUS协议
  20. 最简要的DPlayer样例

热门文章

  1. 软件测试学习笔记(三)控制数据流测试
  2. [渝粤教育] 金陵科技学院 服装立体裁剪 参考 资料
  3. cdn.bootcss.com挂了。访问超时,怎么办?
  4. gdp python 变迁动图_用 Python 带你看各国 GDP 变迁
  5. Big Endian(大端)和 Little Endian(小端)模式
  6. 一个程序员眼中的羽毛球让球事件
  7. 深入Java线程池:从设计思想到源码解读
  8. 测试庖丁解牛分词工具
  9. GE IC698CPE040-JP 中央处理器
  10. 知识图谱入门 【一】- 认识图谱技术