输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针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‘ 的地址交换更替,下面对该部分详细阐述:
原文:https://www.cnblogs.com/john1015/p/12990152.html