
/* 解题思路: 此题可以分三步进行: 1.拷贝链表的每一个节点,拷贝的节点先链接到被拷贝节点的后面 2.复制随机指针的链接:拷贝节点的随机指针指向被拷贝节点随机指针的下一个位置 3.拆解链表,把拷贝的链表从原链表中拆解出来 */
- class Solution {
- public:
- Node* copyRandomList(Node* head) {
- // 1.拷贝链表,并插入到原节点的后面
- Node* cur = head;
- while(cur)
- {
- Node* next = cur->next;
-
- Node* copy = (Node*)malloc(sizeof(Node));
- copy->val = cur->val;
-
- // 插入
- cur->next = copy;
- copy->next = next;
-
- // 迭代往下走
- cur = next;
- }
-
- // 2.置拷贝节点的random
- cur = head;
- while(cur)
- {
- Node* copy = cur->next;
- if(cur->random != NULL)
- copy->random = cur->random->next;
- else
- copy->random = NULL;
-
- cur = copy->next;
- }
-
- // 3.解拷贝节点,链接拷贝节点
- Node* copyHead = NULL, *copyTail = NULL;
- cur = head;
- while(cur)
- {
- Node* copy = cur->next;
- Node* next = copy->next;
-
- // copy解下来尾插
- if(copyTail == NULL)
- {
- copyHead = copyTail = copy;
- }
- else
- {
- copyTail->next = copy;
- copyTail = copy;
- }
-
- cur->next = next;
-
- cur = next;
- }
-
- return copyHead;
- }
- };