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

  • 题目
  • 题目链接
  • 解题思路
    • 题目理解
    • 解题思路
    • 具体代码

题目

题目链接

https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/

解题思路

题目理解

首先要理解题目意思
题目要求复制一份新的链表
意思链表点节点都必须是新生成的节点,且要求保证链表的关系不变
不是让你直接 return head 完事
 
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
第一个节点的 val = 7,random 为 null
第二个节点的 val = 13,random 指向链表的第1个节点,也就是指向 [7, null] 节点
第三个节点的 val = 11,random 指向链表的第5个节点,也就是指向 [1,0] 节点
第四个节点的 val = 10,random 指向链表的第3个节点,也就是指向 [11,4] 节点
第五个节点的 val = 1,random 指向链表的第1个节点,也就是指向 [7, null] 节点
 
PS:节点的 val 是会重复的

解题思路

其实这个题目的难点就在于 random 字段
random 字段可能指向自己前面的节点,可能指向自己,也可能指向自己后面还没生成的节点
假如 random 指向了后面的节点,我们可以 new 出节点没问题,但是后面递归到这个节点时候就要能直接拿到之前已经 new 出的节点
 
因此我这里我用一个 HashMap 来存储已经生成的节点
每生成一个节点就加入到 HashMap 中
后续不管是迭代到的节点,或者是 random 的节点都优先去 HashMap 中找
找的到直接拿出来,找不到就生成一个新的再放进去
HashMap 的 Key 用旧链表的节点来存储,因为 val 是可能重复的

具体代码

/*
// 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) {// head 空判断if (head == null) {return null;}// 临时缓存 HashMap,key 旧节点,value 新生成的对应节点Map<Node, Node> tmp = new HashMap<>();Node headNode = null, parentNode = null, curNode;while (head != null) {// 如果节点已经生成过,就直接从缓存中拿出if (tmp.containsKey(head)) {curNode = tmp.get(head);} else {// 没生成过,new 个新的curNode =  new Node(head.val);// 节点入临时缓存tmp.put(head, curNode);}// 判断是否是首节点if (headNode == null) {// 设置头节点headNode = curNode;} else {// 将上个节点的 next 指向当前节点parentNode.next = curNode;}// next 节点尝试从缓存中取,找不到就生成一个新的放进去if (head.next != null) {if (!tmp.containsKey(head.next)) {tmp.put(head.next, new Node(head.next.val));}curNode.next = tmp.get(head.next);}// random 节点尝试从缓存中取,找不到就生成一个新的放进去if (head.random != null) {if (!tmp.containsKey(head.random)) {tmp.put(head.random, new Node(head.random.val));}curNode.random = tmp.get(head.random);}// 指向下个节点head = head.next;// 当前节点变为上个节点parentNode = curNode;}return headNode;}
}

剑指 Offer 35. 复杂链表的复制相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【算法】剑指 Offer 35. 复杂链表的复制 【重刷】

    1.概述 地址:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 请实现 copyRandomList 函数,复制一个复 ...

  7. leetcode 剑指 Offer 35. 复杂链表的复制

    题意 将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的节点(包括自身或者NULL). 解法 生成一个新的链表,然后根据新老链表同时循环遍历,找到当前老链 ...

  8. 【LeetCode 剑指 Offer 35. 复杂链表的复制(中等)】

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

  9. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

最新文章

  1. 色彩(颜色)空间原理(中)
  2. linux中查看日志技巧,日志查看技巧之筛选[linux命令集][排查篇]
  3. C语言 函数的封装示例(允许存在同名但形参不同函数)
  4. 接受许可协议 将禁用_知识产权小知识|知识产权许可
  5. 响铃:Don't be evil?Google别闹了
  6. 深度学习pytorch--线性回归(二)
  7. spanning-tree extend system-id
  8. 数据源管理 | OLAP查询引擎,ClickHouse集群化管理
  9. 荣新广源B班20121207作业
  10. 2014年CPU排名
  11. html连接sql数据库详解,HTML5 Web SQL数据库使用详解
  12. ov5640帧率配置_OV5640摄像头开窗大小,输出窗口大小,帧率等设置
  13. Apple苹果EDI案例
  14. iPhone、iPad尺寸
  15. 帮你举例说明什么是Python鸭子类型
  16. java课程综合实训报告_Java ME综合实训报告
  17. hdu 2481 树状数组 双关键字排阻
  18. @Value注解获取不到配置值
  19. mysql事务是什么?
  20. 添加Typora主题皮肤

热门文章

  1. 2023 SSM毕设 中药店商城系统(含源码+论文)
  2. 如何用python抓取qq音乐_手把手教你使用Python抓取QQ音乐数据(第三弹)-阿里云开发者社区...
  3. Python创始人为什么叫“龟叔”?
  4. python学习笔记——csv文件
  5. 浪里个浪:Google 北京刚搬进新办公室 走去瞧瞧!
  6. 浅谈新兴室内外无线局域精准定位技术UWB(超宽带)
  7. 移动运营商离网挽留的策略制定(四)
  8. 高压放大器在改良电形成装置参数优化中的应用
  9. [转载]目睹沱江激浪中的生死营救
  10. 计算机运行正常突然关机,电脑开着突然就关机了怎么办_电脑开一会突然关机的处理方法...