1. 题目描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。
  1. 题解
参考链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/
1. 时间O(N),空间O(N)
2. 时间O(N),空间O(1)
3. 时间O(N),空间O(N)
  1. 代码
class Solution {public:Node* copyRandomList(Node* head) {if (!head) return NULL;map<Node*,Node*> mymap;Node* p=head;while (p){Node* tmp=new Node(0);mymap[p]=tmp;p=p->next;}for (auto m:mymap){m.second->val=m.first->val;m.second->random=mymap[m.first->random];m.second->next=mymap[m.first->next];}return mymap[head];}
};
/*
// 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) return NULL;Node* p=head;while (p){Node* tmp=new Node(p->val);tmp->next=p->next;p->next=tmp;p=tmp->next;}p=head;while (p){if (p->random) p->next->random=p->random->next;else p->next->random=NULL;p=p->next->next;}Node* node=new Node(-1),*q=node;p=head;while (p){q->next=p->next;q=q->next;p->next=q->next;p=p->next;}return node->next;}
};
  1. 说明
1. 我们可以使用哈希表,建立链表中每个节点与深拷贝之后相应节点之间的映射关系,之后为其赋值,val
的值相等,next的值即为原链表next节点在map中的对应节点,random的值也为原链表random节点在map中
的对应节点。
2. 我们可以不必使用哈希表来建立映射关系,在原链表中的每个节点后插入和其值相同的节点,这样相邻两个
节点就建立了对应关系,节点的random值为其原节点random的next节点,最后再把拷贝之后的链表抽出来即
可。
3. 将其视作图来进行深度优先搜索。

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

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

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

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

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 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. LUA C 交互 cocos
  2. USB port 如何识别不同的Charger类型
  3. Android通用流行框架汇总
  4. mysql delete exists用法_自学MySQL第五天
  5. java中方法不调用会执行_java[新手]类里的方法没有调用为什么实现了?
  6. Windows: 在系统启动时运行程序、定时计划任务、定时关机
  7. 央行变相降准祭出又一新手段 引发同业套利之忧
  8. ul 原点显示_CSS+HTML ul li列表原点如何相连
  9. 如果成为一名高级安卓开发_想成为一名开发人员? 这是您需要考虑的。
  10. 三个火一个木组成的燊怎么读,燊是什么意思?
  11. 速修复!这个严重的 Apache Struts RCE 漏洞补丁不完整
  12. .NET在后置代码中输入JS提示语句(背景不会变白)
  13. PHP 数组常用操作函数随记
  14. foremost的下载安装使用说明
  15. 使用mybatis生成UUID
  16. 一氧化碳(CO)荧光探针cas855751-82-5,二氧化硫荧光探针 激发波长653 nm,发射波长836 nm-齐岳介绍
  17. 一种辅助整理WoS英文论文题录文档的方法(python-docx)
  18. 2018 阿里 声学模型 语言模型
  19. 俄罗斯方块(C/C++)
  20. cad2017单段线_AutoCAD2017命令总结

热门文章

  1. 算法——贝叶斯公式的推导过程
  2. 真正的出路只有一个(哈佛大学的幸福课)
  3. 第十二届 蓝桥杯 青少年C++组 10月比赛 第1题
  4. 第46课 精益求精 《小学生C++趣味编程》
  5. android 自动化 录制,android 自动化录制回放测试工具
  6. STM32H743+Keil-将变量定义到指定内存
  7. docker安装部署_有关docker安装yearning和部署inception(闭源)
  8. 【ES9(2018)】Object Rest Spread
  9. 【ES9(2018)】for await...of
  10. uni怎么使用原生html标签,uni-app如何完美解析富文本内容