题目:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
解题思路:
这道题的一个难点就是链表中的随机指针,我能想到的就是在这个链表的每个节点后面都克隆一个相同的节点,然后让这两个链表断开连接,返回新链表就可以。
思路图解:
代码解析:
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;
}
};