1. 题目

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

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

《剑指Offer》同题:面试题35. 复杂链表的复制

2. 解题

类似题目:LeetCode 1484. 克隆含随机指针的二叉树(哈希/递归)

  • 哈希表存储映射《原节点,新节点》
class Solution {public:Node* copyRandomList(Node* head) {if(head == NULL)return NULL;unordered_map<Node*, Node*> m;//原节点-新节点 哈希表Node *cur = head, *newNode;while(cur != NULL)//先创建新节点,赋值{newNode = new Node(cur->val);m[cur] = newNode;cur = cur->next;}cur = head;while(cur != NULL)//再次遍历,查表,把新节点指针付进去{m[cur]->next = m[cur->next];m[cur]->random = m[cur->random];cur = cur->next;}return m[head];}
};

  • 原地算法,先复制一遍链表 a ->a.-> b-> b.-> ...
  • 接好新链表random
  • 拆开两条链表
class Solution {public:Node* copyRandomList(Node* head) {if(!head)return NULL;Node* cur = head, *newNode, *H;while(cur)//复制一遍原链表 a a` b b`... {newNode = new Node(cur->val);newNode->next = cur->next;cur->next = newNode;cur = newNode->next;}cur = head;newNode = cur->next;while(cur)//把新链表的random接好{if(cur->random)newNode->random = cur->random->next;cur = cur->next->next;if(cur)newNode = cur->next;}cur = head;H = newNode = cur->next;while(newNode->next)//两条链表拆开{cur->next = newNode->next;newNode->next = newNode->next->next;cur = cur->next;newNode = newNode->next;}cur->next = NULL;return H;}
};

LeetCode 138. 复制带随机指针的链表(哈希 / 深拷贝)相关推荐

  1. LeetCode 138 复制带随机指针的链表-中等

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其中每个新 ...

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

    题目描述 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表.每个节点 ...

  3. Leetcode 138. 复制带随机指针的链表 解题思路及C++实现

    解题思路: 主要包括三步. 第一步是遍历一次链表,复制其每一个节点,并将所复制的节点接在其后. 第二步是遍历一次链表,解决拷贝节点的random指针的指向. 第三步是从这个大链表中,拆出原有链表和拷贝 ...

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

    138. 复制带随机指针的链表 这个题结构体特殊,需要更改上一篇博客的node结构体 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深 ...

  5. leetcode 138. Copy List with Random Pointer | 138. 复制带随机指针的链表(复杂链表的复制)

    题目 https://leetcode.com/problems/copy-list-with-random-pointer/ 题解 复杂链表的复制,经典问题,考察与 HashMap 的结合.注意如果 ...

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

    链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/ https://www.jiuzhang.com/solution ...

  7. 剑指offer T35 复制带随机指针的链表(考察深拷贝的实现)

    题目考察如何实现DeepCopy case1: 然后可以边遍历边创建对应的复制节点,并且使用一个Map来保存原来的节点以及复制后的节点的映射关系,之后再去遍历原链表,基于原节点的next和random ...

  8. 【刷题日记】3.复制带随机指针的链表

    目录 一.题目介绍 ​编辑 二.题目分析 三.代码实现 题目链接:138. 复制带随机指针的链表 - 力扣(LeetCode) 一.题目介绍 我们最一开始看到题目可能会没有思路,或者压根就不知道如何下 ...

  9. M1: 复制带随机指针的链表

    一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...

最新文章

  1. 质数,约数(数论) AcWing算法课
  2. poj -- 1185 炮兵阵地
  3. python汇率编程_【菜鸟学Python】案例一:汇率换算
  4. C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁...
  5. jakarta ee_关于Jakarta EE软件包名称更改的思考
  6. Number.parseInt(), Number.parseFloat()
  7. VIP4.0-MQ消息中间件在分布式系统中的作用
  8. java从入门到精通_Java大数据:数据库开发从入门到精通
  9. 2017c语言国二试题,国家计算机c语言二级考试试题
  10. java 泛型对象实例化_java泛型对象的实例化
  11. 水仙花数,用scratch编程实现
  12. 2021-2027全球与中国创建和销售在线课程平台市场现状及未来发展趋势
  13. kmeans聚类理论篇
  14. 良心分享!最全面cmd快捷指令及使用方法,万字总结
  15. laravel mysql 时区_Laravel时区设置
  16. iOS: pch 如何添加项目中
  17. 直播、录播、录视频等
  18. Chrome浏览器使用谷歌翻译插件的正确方法
  19. 闲扯测试工程师之发展(觉得不错,拿来与大家分享)
  20. 数据库三大范式、BC范式、第四范式

热门文章

  1. C++成员函数重载、覆盖和隐藏的区别
  2. 计算机表格复制粘贴后不变,excel表格复制粘贴后格式不变
  3. 测试Markdown
  4. JSONObject,JSONArray,对象,数组互相转化
  5. 青蛙学Linux—NFS
  6. Selenium断言的使用,等待
  7. java——IO流整理(一)
  8. 实施vertex compression所遇到的各种问题和解决办法
  9. 用Sass创建MetaFizzy效果
  10. CentOS6.4安装包初识