首页 > 代码库 > ADT20 混淆编译

ADT20 混淆编译

题目的关键是要让新链表和原有链表发送关联,可以通过这种关联来设置新链表的random pointer

思路:将新链表的元素插入到原有链表元素的后面,如下图所示,就可以根据原有链表的radom->next 就是新链表的random指针

所以分3步骤:

1 新元素插入

2 设置新链表的random

3 拆分大链表,回复old link 和new link

 

 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  
10 class Solution {
11 public:
12     RandomListNode *copyRandomList(RandomListNode *head) {
13         
14         RandomListNode* pOld = head;
15         RandomListNode* pNew = NULL;
16         RandomListNode* pRes = NULL;
17         
18         if(head == NULL) return NULL;
19         
20         // insert every new node after old new node
21         while(pOld)
22         {
23             pNew = new RandomListNode(pOld->label);
24             if(pOld == head) pRes = pNew;
25             pNew->next = pOld->next;
26             pOld->next = pNew;
27             pOld = pNew->next;
28         }
29         
30 
31         pOld = head;
32         // constrct new‘s random pointer
33         while(pOld)
34         {
35             pNew = pOld->next;
36             if(pOld->random == NULL)
37                 pNew->random == NULL;
38             else 
39                 pNew->random = pOld->random->next;
40             pOld = pNew->next;
41         }
42 
43 
44         // recover old‘s and new‘s next pointer
45         //恢复old list 和new list
46   
47         pOld = head;
48         
49         while(pOld)
50         {
51             pNew = pOld->next;
52             if(pNew == NULL)
53                 pOld->next = NULL;
54             else
55                 pOld->next = pNew->next;
56             pOld = pNew;
57         }
58 
59         return pRes;   
60     }
61 };