算法基础~链表~复杂链表(带有随机指针的链表)深度拷贝
2021/7/21 14:40:55
本文主要是介绍算法基础~链表~复杂链表(带有随机指针的链表)深度拷贝,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
算法基础~链表~复杂链表(带有随机指针的链表)深度拷贝
1,复杂链表图解:
2,第一印象思路:若是没有随机指针的标志的话,则简单啦。
知识点:指针指向~地址【结点地址】
3,本题难点:因为随机指针的指向而使得链表变得复杂无序化~~~~
~解决:无序化,则有序化呀,找出规律!
(将结点有序化~将结点所在地址“有序化”~~编号id,这样的话,随机指针指向边有“id编号”)
4,id编号化结点位置图解:
5,过程:第一个结点位置 id = 0; 第二个结点位置 id = 1; 第三个结点位置 id = 2;
第四个结点位置 id = 3; 第五个结点位置 id = 4; 第六个结点位置 id = 5;
【结点位置 id】 这是一种映射呀宝贝,so, map 结构~【结点位置,id】
6,在这样一番“有序化”操作后,看图,“第一个结点(id = 0)的随机指针指向 id = 2 的结点。”~“有序化”~
~联想到 List(有序)的存储结构,我们使用的是List 的子类vector。 “第一个结点(id = 0)的随机指针指向 id = 2 的结点。”~
~则用vector表达为:vector[0]->random = vector[2].
7,直接上代码,分析过程如上:
ps:代码中定义了一个辅助指针 ptr,作用是因为原链表需要被遍历两次,如果只遍历一次的话,头指针移动就够了,so,遍历两次原链表,
加了一个辅助指针,而头指针不动,才能回头第一个结点
public class Solution { public: RandomListNode *copyRandomList(RandomListNode *head){ std::map<RandomListNode *, int> node_map; std::vector<RandomListNode *> node_vector; RandomListNode *ptr = head; int i = 0; while(ptr){ //vector依次元素装上原链表的结点 node_vector.push_back(new RandomListNode(ptr->label)); //初始化map集合,构建【结点位置,id】 node_map[ptr] = i; ptr = ptr->next; i++; } node_vector.push_back(0); //ptr指针回到原链表第一个结点 ptr = head; i = 0; //把vector中的结点连在一起成一条链,并且同时随机指针的指向标志好 while(ptr){ node_vector[i]->next = node_vecotr[i + 1]; if(ptr->random){ int id = node_map[ptr->random]; node_vector[i]->random = node_vector[id]; } ptr = ptr->next; i++; } return node_vector[0]; } }
这篇关于算法基础~链表~复杂链表(带有随机指针的链表)深度拷贝的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
- 2024-11-24细说敏捷:敏捷四会之每日站会
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解