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

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码 只 接受原链表的头节点 head 作为传入参数。

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

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

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

示例 4:

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

提示:

0 <= n <= 1000
-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。

代码如下:

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {public:Node* copyRandomList(Node* head) {if(head==nullptr){return nullptr;}unordered_map<Node*,Node*>map;Node *newhead = new Node (head->val);map[head] = newhead;Node *pre = newhead;for (auto it = head->next;it!=nullptr;it = it->next){Node *cur = new Node(it->val);map[it] = cur;pre->next = cur;pre = cur;}for (auto it = head;it!=nullptr;it = it->next){map[it]->random = map[it->random];}return newhead;}
};

LeetCode 138 复制带随机指针的链表-中等相关推荐

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

    1. 题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. <剑指Offer>同题:面试题35. 复杂链表的复制 2 ...

  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. 【刷题日记】3.复制带随机指针的链表

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

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

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

  9. 【力扣】复制带随机指针的链表题解 C语言实现

    前言 这是力扣里的一道经典链表题,据说掌握此题你对链表的理解能力就是优秀水平了 题目 /*** Definition for a Node.* struct Node {* int val;* str ...

最新文章

  1. mvc2中如何在下拉列表中显示含有子类的项(子类前加--)
  2. 【C语言】复合逻辑运算
  3. Python协程--迭代器
  4. http 错误 404.0 - not found_电脑Regsvr32 用法和错误消息的说明
  5. Spring boot 内部服务调用 (FeignClient)
  6. python 模块,模块名和包 最最简单的使用 入门级 不够详细 不建议参考- - 扫一眼就好
  7. 【机器学习-西瓜书】六、支持向量机:核技巧;软间隔;惩罚因子C;松弛变量
  8. CAAnimation KeyPath学习总结
  9. PAT1008数组元素循环右移问题(2,3测试点不过的解决办法)
  10. 4.2创建自定义Spring Boot自动配置Starter
  11. 拖后腿了吗?工信部称8兆以上宽带占比44.4%
  12. Linux开发环境——RHEL7更换yum源
  13. 便签pc android同步,Windows/iPhone/Android多端同步便签软件
  14. 2020华为海思的实习生面试记录(雨人)
  15. mandriva urpm类命令
  16. 温度传感器—LM75
  17. 五点差分法 matlab,【五点|五点差分法(matlab)解椭圆型偏微分方程】
  18. 不同产品生命周期的营销策略
  19. 微带贴片天线的分析方法-传输线模型法
  20. java+ElementUI前后端分离旅游项目第七天 权限管理和图形报表

热门文章

  1. Android之网络请求通过协程+okhttp的没有做网络异常处理导致程序奔溃问题
  2. linux之通过grep使用or、and、not操作
  3. Android之华为meta10 pro安卓8.0绑定服务(bindService)失败解决办法
  4. C++ 语法都不会怎么写代码? 03
  5. c语言在win8系统不兼容,Win8系统中存在不兼容软件如何解决?
  6. 实验报告类与对象水井问题_物业设施设备巡检检查对象、周期和频次
  7. 超越Linux!华为鸿蒙明年将成“第五大操作系统”,网友:何时超过iOS?
  8. 那些曾经拥有的最大快乐,都是好奇心的结果
  9. 不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?
  10. 再过四十年,你的女朋友可能是个美丽的机器人!不信你看