题目描述:给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。

首先,我先解释一下题目的意思。就是完全按照给出的链表的关系复制链表,比如,原链表中值为1的节点的next指向的是值为2的节点,随机指针指向值为3的节点,那么,复制之后,还是应该满足这样的指向关系,但是,因为是复制的链表,所以,存储在内存空间中的位置当然和原先不同。

我们当然第一想法就是一个个复制节点,但是难度在于什么呢?复制前面节点的时候并不知道他要指向的节点(不论是随机还是next)在哪个地址。所以,直接简单粗暴复制是肯定不行的。

为了能够准确复制每个节点的指针,就必须要建立原链表与新链表对应节点的关系。但是因为每个节点只有一个next指针,所以,我们还需对新链表的next指针做处理,让节点之前的前后关系保持住。就如下图所示:

其中,上面的一个是原链表,我们发现,只要对两个链表的next指针做出如上图所示处理,就不难复制随机指针了。

思路可以这样:

1. 遍历原链表,建立如图所示的结构

2. 根据这个结构,复制随机指针

3. 处理复制链表的next指针

代码如下:

# Definition for singly-linked list with a random pointer.
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:# @param head: A RandomListNode# @return: A RandomListNodedef copyRandomList(self, head):if head is None:return head# 建立关联结构cur = headwhile cur:temp = curcur = cur.nextcopy_node = RandomListNode(temp.label)copy_node.next = temp.nexttemp.next = copy_node# 复制随机指针cur = headwhile cur:temp = cur.randomcur.next.random = cur.random.next if temp else Nonecur = cur.next.next# 复制next指针copy_cur, copy_head = head.next, head.nextwhile copy_cur and copy_cur.next:copy_cur.next = copy_cur.next.nextcopy_cur = copy_cur.nextcopy_cur.next = Nonereturn copy_head# write your code here

这个结构的构造很有技巧,充分利用了新旧两个链表节点的next指针,一方面,令原链表next指针负责保持节点之间的对应关系,这个逻辑有点“哈希表”的味道;另一方面,由于原链表中每个节点都被孤立,所以令新链表的next指针负责保持前后关系, 不至于让新生成的节点“找不着”。

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

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

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

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

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

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

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

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

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

  5. python 带随机指针的链表深度复制_LeetCode:复制带随机指针的链表

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

  6. 【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例

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

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

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

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

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

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

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

  10. [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. mac下找不到.m2文件解决方法
  2. elementui select组件选中后无法自动刷新更新值渲染到页面中
  3. Java JDBC批处理插入数据操作
  4. CGI模式,模块模式与CLI模式运行PHP的区别
  5. JS实现sleep功能 JS遍历document对象
  6. ios8 地图不能定位问题的解决办法
  7. 如何查看/统计当前AD域控制器的活动用户
  8. owa outlook使用中的一些问题-陆续添加
  9. 炫酷报表制作工具推荐:RDP报表工具
  10. javascript --关灯游戏
  11. Python安装pygame教程
  12. 使用js计算字符串的长度
  13. 190115_Vue下路由History mode导致页面无法渲染的原因
  14. Scrum立会报告+燃尽图(十月二十七日总第十八次)
  15. TryHackMe - Thompson靶场
  16. 【PIL处理图片】小技巧之画虚线、加粗字体、长文本自动分行(符号处理)
  17. cmath中常用的函数
  18. dream of/dress up/drink to等动词词组
  19. CDN到底是个什么鬼?看完这篇你就懂了!
  20. idea 分支管理插件_git flow 分支管理idea 具体操做

热门文章

  1. C++字符串完全指南(转)
  2. c++中 .hpp和.h文件的区别
  3. Canvas.toDataURL 用不了咋办?
  4. Mapbox 笔记1(Mapbox 是如何工作的)
  5. Re 39:读论文 CTM Augmenting Legal Judgment Prediction with Contrastive Case Relations
  6. scrapy与mongoDB完美结合
  7. Ngix 负载均衡之session共享
  8. 疯狂java讲义epub_为讲义创建EPUB
  9. Hadoop学习笔记-集群部署
  10. 【设计】宣传单尺寸等设计要点