第一步复制节点, 先不然random节点
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
// step 1
RandomListNode* temp = phead;
while (temp)
{
RandomListNode* node = new RandomListNode;
node->label = temp->label;
node->next = temp->next;
temp->next = node;
temp = temp->next->next;
}
}
};
第二步处理复制后的各个节点的ramdom
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
// step 1
RandomListNode* temp = phead;
while (temp)
{
RandomListNode* node = new RandomListNode;
node->label = temp->label;
node->next = temp->next;
temp->next = node;
temp = temp->next->next;
}
// step 2
temp = head;
while (temp->random)
{
temp->next->random = temp->random->next;
temp = temp->next->next;
}
}
};
第三步断开复制后的各个节点
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
// step 1
RandomListNode* temp = pHead;
while (temp)
{
RandomListNode* node = new RandomListNode;
node->label = temp->label;
node->next = temp->next;
temp->next = node;
temp = temp->next->next;
}
// step2
temp = pHead;
while (temp)
{
if(temp->random) // 存在ramdom 指向空
temp->next->random = temp->random->next;
temp = temp->next->next;
}
// step 3
temp = pHead;
auto pCopy = pHead->next; // 拷贝后的节点移动指针
auto pCopyHead = pHead->next; // 拷贝后的节点头
while (temp)
{
temp->next = temp->next->next; // 断开链接
if (pCopy->next)
{
pCopy->next = pCopy->next->next;
pCopy = pCopy->next;
}
temp = temp->next;
}
return pCopyHead;
}
};