题目:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
解题思路:
这道题的一个难点就是链表中的随机指针,我能想到的就是在这个链表的每个节点后面都克隆一个相同的节点,然后让这两个链表断开连接,返回新链表就可以。
思路图解:
代码解析:
Node* BuyNewNode(int data){Node* ret = (Node*)malloc(sizeof(Node));if(ret == NULL)assert(0);ret->val = data;ret->next = NULL;ret->random = NULL;return ret;}
class Solution {
public:Node* copyRandomList(Node* head) {if(head == NULL)return NULL;//在原链表每一个节点的后面克隆一个新节点Node* pCur = head;Node* pNew = NULL;while(pCur){pNew = BuyNewNode(pCur->val);pNew->next = pCur->next;pCur->next = pNew;pCur = pNew->next;}//更新克隆节点的随机指针域pCur = head;while(pCur){pNew = pCur->next;if(pCur->random)pNew->random = pCur->random->next;pCur = pNew->next;}//将克隆的节点开始分离Node* p1 = head;Node* p2 = head->next;Node* ret = head->next;while(p2){p1->next = p2->next;p1 = p2;p2 = p2->next;}return ret;}
};