#include <iostream>
using namespace std;
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == NULL) {
return pHead;
}
RandomListNode *pNode = pHead;
while (pNode != NULL) {//第一步clone原有节点,插入到该节点后面
RandomListNode *pInsertNode = new RandomListNode(pNode->label);
pInsertNode->next = pNode->next;
pNode->next = pInsertNode;
pNode = pInsertNode->next;
}
pNode = pHead;
while (pNode != NULL) {//第二步clone原有节点的random
if (pNode->random != NULL) {
pNode->next->random = pNode->random->next;
}
pNode = pNode->next->next;
}
RandomListNode *pCloneHead = pHead->next;
pNode = pHead;
RandomListNode *pCloneNode = pCloneHead;
while (pNode != NULL && pCloneNode != NULL) {//第三步分离
pNode->next = pCloneNode->next;//pNode提前变为NULL
pNode = pNode->next;
if (pNode == NULL) {
break;
}
pCloneNode->next = pNode->next;
pCloneNode = pCloneNode->next;
}
return pCloneHead;
}
};
int main(void)
{
RandomListNode p1(1), p2(2), p3(3), p4(4), p5(5);
p1.next = &p2;
p1.random = &p3;
p2.next = &p3;
p2.random = &p5;
p3.next = &p4;
p4.next = &p5;
p4.random = &p2;
RandomListNode *Head = NULL;
Solution s;
Head = s.Clone(&p1);
return 0;
}