首页 > 其他 > 详细

剑指offer 复杂链表的复制

时间:2020-05-30 01:17:04      阅读:51      评论:0      收藏:0      [点我收藏+]

题目:

  输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针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 的头地址开始,删除掉原链表的元素。

 

拷贝部分参考:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/lian-biao-de-shen-kao-bei-by-z1m/

剑指offer 复杂链表的复制

原文:https://www.cnblogs.com/john1015/p/12990152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!