python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表
链表--深度拷贝一个带有随机指针的链表
链表--深度拷贝一个带有随机指针的链表
本文介绍两种解法。
解法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 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表相关推荐
- 深度复制_最新深度调研,券商是大行情!有可能复制历次牛市行情!!!
作者:澄泓新视界 编辑:澄泓君 我们在2月中旬把握住了券商的启动点,从我们介入之日至今,券商整个板块涨幅已经达到31%. 想要回顾咱们关于券商的深度调研文章,可以在文章末尾点击"阅读原文&q ...
- 每天一道LeetCode-----复制一个带有随机节点的链表
Copy List with Random Pointer 原题链接Copy List with Random Pointer 深拷贝一个链表,链表节点的成员包括 指向下一个节点的指针 指向一个随机节 ...
- 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...
- python链表的创建_《大话数据结构》配套源码:链表(Python版)
该书随书源码的语言为C:我参考书中内容和配套源码,写了一套Python格式的配套源码.这套配套源码并非直接翻译C语言的配套源码,而是结合我的理解略作了修改. SinglyLinkedNode 单链表结 ...
- python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ (一)数组 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. ...
- python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...
楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...
- Java三维数组深度复制,JavaScript —— 如何深浅拷贝数组
这两天遇到了一个问题,如何复制数组,所以就从各个地方找了很多的解决办法.算是整理一下,这样以便于自己以后的学习: 目录 浅拷贝数组 深拷贝数组 1.使用数组遍历赋值 原理 代码实现 2.返回新数组方法 ...
- 差分隐私 深度学习_在深度学习中保护数据隐私 第三部分
差分隐私 深度学习 Link to part 1 (Basics of Federated Learning): https://towardsdatascience.com/preserving-d ...
- java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素
如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...
最新文章
- E: Could not get lock /var/lib/dpkg/lock解决
- 生成JSON数据--fastjson(阿里)方法
- 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!
- c#调用c++dll接口及回调函数
- [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器
- (C#)Winform修改DateTimePicker控件的背景色和边框色
- 扑捉和捕捉的区别照相_3种摄影中捕捉动作的基本方法
- GitHub:Python 强化学习实用指南
- 亚马逊全面发力AI,推机器学习托管服务、四项新工具,还有AI硬件
- instantclient19\12\11版本下载
- 离开一线三年后,码农们都过上好的生活了吗
- 黑客组织“洋葱狗”潜伏3年终曝光 定期偷袭能源及交通行业
- 论文笔记1:Full-Spectrum Denoising of High-SNR Hyperspectral Images
- 一个简单的拼音输入法,实现常用汉字的输入
- ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)
- 工信部信息技术发展司谢少锋司长高度评价华云数据“自主创新”的钻研精神
- miui主题编辑器和java jdk_JDK、Jmeter安装与配置
- css水平垂直居中方法(全网最全)
- Linux 压缩管理、进程管理、网络管理命令总结
- 百度大脑机动车销售发票、车辆合格证以及机打发票OCR正式商用啦