【剑指offer】复杂链表的复制

题目链接:复杂链表的复制

 

题意:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

 

题解:啊这个题我没看懂其实。我看了剑指的题解。大概就是要分三步

1、复制指针的label和next。将复制的节点跟在原节点后面。然后创造新的链表。

2、设置复制出来的新链表的random。

3、分离新旧链表。

 

 

 

代码:

 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         RandomListNode* cur = pHead;
15         RandomListNode* list = NULL;
16         RandomListNode* tail = NULL;
17         if(cur == NULL) return NULL;
18         //复制原来的节点
19         while(cur){
20             RandomListNode* node = new RandomListNode(cur->label);
21             RandomListNode* next = cur->next;
22             
23             cur->next = node;
24             node->next = next;
25             
26             cur = node->next;
27         }
28         //random
29         cur = pHead;
30         while(cur){
31             if(cur->random){
32                 RandomListNode* next = cur->next;
33                 next->random = cur->random->next;
34             }
35             else    cur->next->random = NULL;
36             cur = cur->next->next;
37         }
38         
39         list = tail = pHead->next;
40         pHead->next = list->next;
41         cur = pHead->next;
42         while(cur){
43             RandomListNode* copy = cur->next;
44             cur->next = copy->next;
45             
46             tail->next = copy;
47             tail = copy;
48             
49             cur = cur->next;
50         }
51         return list;
52     }
53 };

 

posted @ 2020-03-03 22:02  甜酒果。  阅读(142)  评论(0编辑  收藏  举报