1 #include <bits/stdc++.h> 2 using namespace std; 3 4 class Solution { 5 public: 6 Node* copyRandomList(Node* head) 7 { 8 //第一步:遍历原链表生成新链表,同时用哈希表 memo 存储原链表和新链表对应节点之间的映射关系; 9 //第二步:再次遍历原链表,根据原链表每个节点的随机指针和memo,在维护新链表的随机指针; 10 if(head == NULL) 11 { 12 return NULL; 13 } 14 unordered_map<Node*,Node*> memo;//原节点--> 对应的新生成节 15 Node* copy_head = new Node(head->val); 16 memo[head] = copy_head; 17 Node* front_ptr = copy_head; 18 Node* work_ptr = head->next; 19 while (work_ptr != NULL) 20 { 21 Node* tmp_ptr = new Node(work_ptr->val); 22 front_ptr->next = tmp_ptr; 23 front_ptr = tmp_ptr; 24 memo[work_ptr] = tmp_ptr; 25 work_ptr = work_ptr->next; 26 } 27 work_ptr = head; 28 while (work_ptr != NULL) 29 { 30 if(work_ptr->random != NULL) 31 { 32 memo[work_ptr]->random = memo[work_ptr->random]; 33 } 34 work_ptr = work_ptr->next; 35 } 36 return copy_head; 37 } 38 };