链表--深度拷贝一个带有随机指针的链表

链表--深度拷贝一个带有随机指针的链表

本文介绍两种解法。

解法1:利用一个map

ListNode *copyRandomList(ListNode *head)

{

if(head == NULL || head->next == NULL)

return head;

//定义一个map hashMap用于存储旧节点和新节点的映射关系

map hashMap;

ListNode *tmpNode = head;

ListNode *dummy = new ListNode(0);

ListNode *newHead = dummy;

//第一次循环主要是分配新空间和建立旧节点和新节点的映射关系

while(tmpNode != NULL)

{

dummy->next = new ListNode(tmpNode->val);

dummy = dummy->next;

//存储旧节点和新节点的映射关系

hashMap[tmpNode] = dummy;

tmpNode = tmpNode->next;

}

//第二次循环把新节点的random指针赋值

tmpNode = head;

while(tmpNode != NULL)

{

ListNode *newNode = hashMap[tmpNode];

if(tmpNode->random != NULL)

{

newNode->random = hashMap[tmpNode->random];

}else{

newNode->random = NULL;

}

tmpNode = tmpNode->next;

}

return newHead->next;

}

方法2: 还有一种更好的方法,看下图就能理解。

1)先复制一份原链表,然后更新新链表的random: node->next->random = node->random->next;最后拆分两个链表。

ListNode *copyRandomList(ListNode *head)

{

if(head == NULL)

return head;

//在原链表的每一个节点之后复制一个新的节点

ListNode *currNode = head;

while(currNode != NULL)

{

ListNode *tmpNode = currNode->next;

currNode->next = new ListNode(currNode->val);

currNode->next->next = tmpNode;

currNode = tmpNode;

/*

本循环的另一种方法

ListNode *tmpNode = new ListNode(currNode->val);

tmpNode->next = currNode->next;

currNode->next = tmpNode;

currNode = tmpNode->next;

*/

}

//再遍历一次更新新链表的random节点

currNode = head;

while(currNode != NULL && currNode->next != NULL)

{

ListNode *tmpNode = currNode->next->next;

if(currNode->random != NULL)

{

currNode->next->random = currNode->random->next;

}else{

currNode->next->random = NULL;

}

currNode = tmpNode;

/*

第二个循环更优雅的写法:

while(currNode != NULL)

{

ListNode *tmpNode = currNode->next;

if(currNode->random != NULL)

{

tmpNode->random->currNode->random->next;

}else{

tmpNode->random = NULL;

}

currNode = tmpNode->next;

}

*/

}

//拆分两个链表

ListNode *dummyNode = new ListNode(0);

ListNode *newHead = dummyNode;

currNode = head;

while(currNode != NULL && currNode->next != NULL)

{

dummyNode->next = currNode->next;

dummyNode = dummyNode->next;

currNode->next = currNode->next->next;

currNode = currNode->next;

}

dummyNode->next = NULL;

return newHead->next;

/*

拆分链表的另一种写法:

currNode = head;

ListNode *dup = head->next;

while(currNode != NULL)

{

ListNode *tmpNode = currNode->next;

currNode->next = tmpNode->next;

if(tmpNode->next)

tmpNode->next = tmpNode->next->next;

currNode = currNode->next;

}

return dup;

*/

}

链表--深度拷贝一个带有随机指针的链表相关教程

python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表相关推荐

  1. 深度复制_最新深度调研,券商是大行情!有可能复制历次牛市行情!!!

    作者:澄泓新视界 编辑:澄泓君 我们在2月中旬把握住了券商的启动点,从我们介入之日至今,券商整个板块涨幅已经达到31%. 想要回顾咱们关于券商的深度调研文章,可以在文章末尾点击"阅读原文&q ...

  2. 每天一道LeetCode-----复制一个带有随机节点的链表

    Copy List with Random Pointer 原题链接Copy List with Random Pointer 深拷贝一个链表,链表节点的成员包括 指向下一个节点的指针 指向一个随机节 ...

  3. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  4. python链表的创建_《大话数据结构》配套源码:链表(Python版)

    该书随书源码的语言为C:我参考书中内容和配套源码,写了一套Python格式的配套源码.这套配套源码并非直接翻译C语言的配套源码,而是结合我的理解略作了修改. SinglyLinkedNode 单链表结 ...

  5. python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ (一)数组 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. ...

  6. python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...

    楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...

  7. Java三维数组深度复制,JavaScript —— 如何深浅拷贝数组

    这两天遇到了一个问题,如何复制数组,所以就从各个地方找了很多的解决办法.算是整理一下,这样以便于自己以后的学习: 目录 浅拷贝数组 深拷贝数组 1.使用数组遍历赋值 原理 代码实现 2.返回新数组方法 ...

  8. 差分隐私 深度学习_在深度学习中保护数据隐私 第三部分

    差分隐私 深度学习 Link to part 1 (Basics of Federated Learning): https://towardsdatascience.com/preserving-d ...

  9. java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素

    如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...

最新文章

  1. E: Could not get lock /var/lib/dpkg/lock解决
  2. 生成JSON数据--fastjson(阿里)方法
  3. 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!
  4. c#调用c++dll接口及回调函数
  5. [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器
  6. (C#)Winform修改DateTimePicker控件的背景色和边框色
  7. 扑捉和捕捉的区别照相_3种摄影中捕捉动作的基本方法
  8. GitHub:Python 强化学习实用指南
  9. 亚马逊全面发力AI,推机器学习托管服务、四项新工具,还有AI硬件
  10. instantclient19\12\11版本下载
  11. 离开一线三年后,码农们都过上好的生活了吗
  12. 黑客组织“洋葱狗”潜伏3年终曝光 定期偷袭能源及交通行业
  13. 论文笔记1:Full-Spectrum Denoising of High-SNR Hyperspectral Images
  14. 一个简单的拼音输入法,实现常用汉字的输入
  15. ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)
  16. 工信部信息技术发展司谢少锋司长高度评价华云数据“自主创新”的钻研精神
  17. miui主题编辑器和java jdk_JDK、Jmeter安装与配置
  18. css水平垂直居中方法(全网最全)
  19. Linux 压缩管理、进程管理、网络管理命令总结
  20. 百度大脑机动车销售发票、车辆合格证以及机打发票OCR正式商用啦

热门文章

  1. Gradle学习之使用java plugin
  2. hadoop版本升级到2.4.1
  3. 自动化部署工具PUPPET介绍
  4. 简单易用的IT运维服务器管理程序分享!
  5. CCIE基础知识之EIGRP 二
  6. c语言编程题一空几分,C语言编程规范试题
  7. ppt中的流程图怎么整体移动_PPT中图片太丑了?该怎么办?
  8. 应用vb编程_VB编程中的列表框综合应用讲解
  9. 10-C++远征之模板篇-学习笔记
  10. Codewars-Javascript训练手册:Date 对象