请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

注意

  • 函数结束后原链表要与输入时保持一致。

解题思路

形如 $1->2->3->4$ 的节点,我们可以利用 next 指针来指向复制节点,例如:

$1->1_{copy}->2->2_{copy}->3->3_{copy}->4->4_{copy}$

然后再断掉链条就可以了

解题代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     ListNode *next, *random;
 *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        #define Node ListNode
        auto p = head;
        if(p ==NULL) return NULL;
        while(true) {
            if(p==NULL) break;
            auto next = p->next;
            ListNode* p_copy = new Node(p->val);
            p->next = p_copy;
            p_copy->next = next;
            p = next;
        }
        p = head;
        while(true) {
            if(p==NULL) break;
            if(p->random) {
                p->next->random = p->random->next;
            }
            p = p->next->next;
        }
        
        p = head;
        Node fake(-1);
        Node* q= &fake;
        while(true) {
            if(p==NULL) break;
            q->next = p->next;
            q = q->next;
            p ->next = p->next->next;
            p = p->next;
            
        }
        
        
        return fake.next;
        
        
    }
};