输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的解答此题。看图便知。
首先是原始的链表
然后我们还是首先复制每一个结点N为N*,不同的是我们将N*让在对应的N后面,即为
然后我们要确定每一个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 };