解题思路:
过程分为三步:
首先,遍历链表,复制当前结点currentNode对应的结点cloneCurNode,并将cloneCurNode放置在currentNode的后面,这样就形成一条包含原始链以及复制链的长链。
然后,还需将原始链中指针的方向赋予复制链
最后,将长链拆分,就得到原始链和复制链了。
/*
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)
return NULL;
RandomListNode* pNode = pHead;
RandomListNode* nextNode = pNode->next;
while(pNode)
{
RandomListNode* temp = new RandomListNode(pNode->label);
pNode->next = temp;
temp->next = nextNode;
pNode = temp->next;
if(pNode) //处理本身链表只有一个结点和遍历到最后一个节点的情况
{
nextNode = pNode->next;
}
}
pNode = pHead; //开始处理随机指针
while(pNode)
{
if(!pNode->random)
{
pNode->next->random = NULL;
}
else
pNode->next->random = pNode->random->next;
pNode = pNode->next->next;
}
//开始拆分链表
RandomListNode* CloneList = pHead->next;
RandomListNode* CloneNode = CloneList;
pNode = pHead;
while(pNode)
{
pNode->next = CloneNode->next;
pNode = pNode->next;
if(pNode) //处理链表只有一个节点和到最后一个节点
{
CloneNode->next = pNode->next;
CloneNode = CloneNode->next;
}
}
return CloneList;
}
};