题目的关键是要让新链表和原有链表发送关联,可以通过这种关联来设置新链表的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 };
时间: 2024-10-13 13:34:13