解題思路:
過程分爲三步:
首先,遍歷鏈表,複製當前結點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;
}
};