[Leetcode] Copy list with random pointer 对带有任意指针的链表深度拷贝

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

深度复制:

仅简单的遍历一遍链表时,没法复制random pointer属性。所以有点懵,大神的做法如下,加入个人理解。

思路:对链表进行三次遍历。

第一次遍历复制每一个结点,将新结点接在原结点的后面, 让链表变成一个重复链表,新旧交替;

第二次遍历维护新结点的随机指针,因,新结点是在旧结点之后,所以node->next->random=node->random->next,而node->node结点为新结点,这样,我们就把新结点的随机指针接好了;

第三次遍历,将两新旧结点分开,因为,构成的重复链表是新旧结点交替出现,故,只要每隔一个节点相连即可,就完成了对链表的分割。如下图:

 1 /**
 2  * Definition for singly-linked list with a random pointer.
 3  * struct RandomListNode {
 4  *     int label;
 5  *     RandomListNode *next, *random;
 6  *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     RandomListNode *copyRandomList(RandomListNode *head) 
12     {
13         if(head==NULL)  return NULL;
14 
15         //第一步,在oldNode的后面插入一个新的结点
16         RandomListNode *oldNode=head;
17         while(oldNode !=NULL)
18         {
19             RandomListNode *newNode=new RandomListNode(oldNode->label);
20             newNode->next=oldNode->next;
21             newNode->random=oldNode->random;
22             oldNode->next=newNode;
23             oldNode=newNode->next;  //遍历前行
24         }    
25 
26         //第二步,关联random
27         oldNode=head;
28         while(oldNode !=NULL)
29         {
30             if(oldNode->random !=NULL)
31                 oldNode->next->random=oldNode->random->next;
32             oldNode=oldNode->next->next;
33         }
34 
35         //第三步,分开两链表
36         RandomListNode *newList=new RandomListNode(0);
37         newList->next=head;
38         RandomListNode *pHead=newList;
39 
40         oldNode=head;
41         while(oldNode !=NULL)
42         {
43             pHead->next=oldNode->next;
44             oldNode->next=pHead->next->next;
45 
46             pHead=pHead->next;
47             oldNode=oldNode->next;
48         }
49 
50         return newList->next;
51     }
52 };

 

posted @ 2017-06-14 16:19  王大咩的图书馆  阅读(235)  评论(0编辑  收藏  举报