A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
思路:首先将原链表复制一个新节点并连接到所复制的节点后面,然后在这样的链表上链接复制节点的random指针。最后分拆链表
时间复杂度O(n),空间复杂度O(1)
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 class Solution { 10 public: 11 RandomListNode *copyRandomList(RandomListNode *head) { 12 if (head == NULL) return head; 13 14 //复制节点 15 for (RandomListNode *curr = head; curr != NULL;) { 16 RandomListNode *pter = new RandomListNode(curr->label); 17 pter->next = curr->next; 18 curr->next = pter; 19 curr = pter->next; 20 } 21 22 //链接random指针 23 for(RandomListNode *curr = head; curr != NULL;) { 24 if (curr->random != NULL) { 25 curr->next->random = curr->random->next; 26 } 27 curr = curr->next->next; 28 } 29 30 //分拆链表 31 RandomListNode *new_head = head->next; 32 for (RandomListNode *curr = head, **new_curr = &new_head; curr != NULL;) { 33 *new_curr = curr->next; 34 curr->next = curr->next->next; 35 36 curr = curr->next; 37 38 new_curr = &((*new_curr)->next); 39 } 40 41 return new_head; 42 } 43 };