复杂链表的复制

这道题目首先不管random指针,按照next指针把链表元素给复制出来。然后处理random指针,比较容易想到的想法是利用哈希思想(或者等价的map,set等stl容器),但这样的话需要辅助空间。

不需要辅助空间的方法,复制元素的时候把原始链表改成这样就可以了:

然后修改新增元素的random指针,再把这个链表拆开,返回新链表。

 1 class Solution {
 2 public:
 3     RandomListNode* Clone(RandomListNode* pHead)
 4     {
 5         if(pHead==NULL)
 6             return NULL;
 7         RandomListNode* root=pHead;
 8         while(root)
 9         {
10             RandomListNode* p=new RandomListNode(root->label);
11             p->next=root->next;
12             root->next=p;
13             root=p->next;
14         }
15         root=pHead;
16         while(root)
17         {
18             if(root->random!=NULL)
19                 root->next->random=root->random->next;
20             root=root->next->next;
21         }
22         RandomListNode* result=pHead->next;
23         RandomListNode* prev=result;
24         root=pHead;
25         while(root->next->next!=NULL)
26         {
27             root->next=prev->next;
28             root=root->next;
29             prev->next=prev->next->next;
30             prev=prev->next;
31         }
32         root->next=NULL;
33         return result;
34     }
35 };
View Code

 

posted @ 2016-03-29 22:52  vaevaevae  阅读(143)  评论(0编辑  收藏  举报