复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的解答此题。看图便知。

首先是原始的链表

绘图1

然后我们还是首先复制每一个结点N为N*,不同的是我们将N*让在对应的N后面,即为

绘图1

然后我们要确定每一个N*的sibling分量,非常明显,N的sibling分量的next就是N*的sibling分量。

最后,将整个链表拆分成原始链表和拷贝出的链表。

这样,我们就解决了一个看似非常混乱和复杂的问题。

PS:时刻注意判断要取的位置是否为NULL,->next 或 ->random。

 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==NULL) return NULL;
15         RandomListNode* ptmp=pHead;
16         while(ptmp!=NULL){
17             RandomListNode* p=new RandomListNode(ptmp->label);
18             p->next=ptmp->next;
19             ptmp->next=p;
20             ptmp=p->next;
21         }
22         RandomListNode* r=pHead->next;
23         ptmp=pHead;
24         while(ptmp!=NULL){
25             if(ptmp->random!=NULL)
26                 r->random=ptmp->random->next;
27             ptmp=r->next;
28             r=ptmp->next;
29         }
30         ptmp=pHead;
31         RandomListNode* res=pHead->next;
32         ptmp->next=res->next;
33         ptmp=res->next;
34         r=res;
35         while(ptmp!=NULL){
36             r->next=ptmp->next;
37             r=r->next;
38             ptmp->next=r->next;
39             ptmp=ptmp->next;
40         }
41         return res;
42     }
43 };
原文地址:https://www.cnblogs.com/zl1991/p/4768228.html