剑指offer 复杂链表的复制
题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
深拷贝与浅拷贝:
(1)深拷贝(Deep Copy),类似于我们常用的复制粘贴,是指在拷贝目标时会另外创造一个一模一样的对象,新对象与元对象不共享内存,修改新对象也不会改到原对象。
(2)浅拷贝(Shallow Copy),只复制指向某个对象的指针,而不是复制对象本身,新旧对象共享一块内存。
代码:
1 /* 2 struct RandomListNode { 3 int label; 4 struct RandomListNode *next, *random; 5 RandomListNode(int x) : 6 label(x), next(NULL), random(NULL) { 7 } 8 }; 9 */ 10 class Solution { 11 public: 12 RandomListNode* Clone(RandomListNode* pHead) 13 { 14 if(!pHead) return NULL; 15 RandomListNode* cur = pHead; 16 //复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面 17 while( cur ){ 18 RandomListNode* list = new RandomListNode(cur->label); 19 list->next = cur->next; 20 cur->next = list; 21 cur = list->next; 22 } 23 //重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next 24 cur = pHead; 25 while( cur ){ 26 if(cur->random) 27 cur->next->random = cur->random->next; 28 cur = cur->next->next; 29 } 30 //拆分链表,将链表拆分为原链表和复制后的链表 31 cur = pHead; 32 RandomListNode* CloneList = pHead->next; 33 RandomListNode* tmp; 34 while( cur->next ){ 35 tmp = cur->next; 36 cur->next = tmp->next; 37 cur = tmp; 38 } 39 return CloneList; 40 } 41 };
我的笔记:
注意:本题的含义是在拷贝之后,既不改变原链表,又要返回拷贝后的链表。因此在最后拆分的步骤中可见是 A 与 A' 的地址交换更替,下面对该部分详细阐述:
- 第一次循环时,*cur 指向 A 的地址(即链表list1 的头地址), *tmp 指向 A’ 的地址(即链表list2 的头地址);
- 执行 cur->next = tmp->next,即将 cur->next 指针 指向 tmp->next 指针所指向的 B 地址,相当于在 链表list1 中将 A' 删除;
- 执行 cur = tmp,即将 cur 指针指向 链表list2 的头地址;
- 第二次循环时,就是以 链表list2 的头地址开始,删除掉原链表的元素。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具