剑指 Offer 35. 复杂链表的复制
剑指 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. 复杂链表的复制相关推荐
- 【LeetCode】剑指 Offer 35. 复杂链表的复制
[LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...
- 【三次优化】剑指 Offer 35. 复杂链表的复制
立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...
- 剑指offer——35复杂链表的复制
这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...
- 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)
题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...
- LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)
文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...
- 【算法】剑指 Offer 35. 复杂链表的复制 【重刷】
1.概述 地址:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 请实现 copyRandomList 函数,复制一个复 ...
- leetcode 剑指 Offer 35. 复杂链表的复制
题意 将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的节点(包括自身或者NULL). 解法 生成一个新的链表,然后根据新老链表同时循环遍历,找到当前老链 ...
- 【LeetCode 剑指 Offer 35. 复杂链表的复制(中等)】
题目: 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...
- 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...
最新文章
- 色彩(颜色)空间原理(中)
- linux中查看日志技巧,日志查看技巧之筛选[linux命令集][排查篇]
- C语言 函数的封装示例(允许存在同名但形参不同函数)
- 接受许可协议 将禁用_知识产权小知识|知识产权许可
- 响铃:Don't be evil?Google别闹了
- 深度学习pytorch--线性回归(二)
- spanning-tree extend system-id
- 数据源管理 | OLAP查询引擎,ClickHouse集群化管理
- 荣新广源B班20121207作业
- 2014年CPU排名
- html连接sql数据库详解,HTML5 Web SQL数据库使用详解
- ov5640帧率配置_OV5640摄像头开窗大小,输出窗口大小,帧率等设置
- Apple苹果EDI案例
- iPhone、iPad尺寸
- 帮你举例说明什么是Python鸭子类型
- java课程综合实训报告_Java ME综合实训报告
- hdu 2481 树状数组 双关键字排阻
- @Value注解获取不到配置值
- mysql事务是什么?
- 添加Typora主题皮肤
热门文章
- 2023 SSM毕设 中药店商城系统(含源码+论文)
- 如何用python抓取qq音乐_手把手教你使用Python抓取QQ音乐数据(第三弹)-阿里云开发者社区...
- Python创始人为什么叫“龟叔”?
- python学习笔记——csv文件
- 浪里个浪:Google 北京刚搬进新办公室 走去瞧瞧!
- 浅谈新兴室内外无线局域精准定位技术UWB(超宽带)
- 移动运营商离网挽留的策略制定(四)
- 高压放大器在改良电形成装置参数优化中的应用
- [转载]目睹沱江激浪中的生死营救
- 计算机运行正常突然关机,电脑开着突然就关机了怎么办_电脑开一会突然关机的处理方法...