劍指offer題解C++【25】複雜連結串列的複製
阿新 • • 發佈:2019-02-11
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
解題思路
原始連結串列:A->B->C->D->…
1 複製每個節點的內容為pnew,並放在相應節點之後(p->next),即
A->A’->B->B’->C->C’->D->D’->…
2 設定random節點的內容:以A為例,假設A的random節點指向C,那麼A’的random節點應該指向C’,即
A->next->random=A’->random=C’=C->next=A->random->next
即p->next->random=p->random->next
3 將長連結串列分開。
程式碼
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL ) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* p=pHead;
RandomListNode* pnext=nullptr;
RandomListNode* pnew=nullptr;
while(p){
pnext=p->next;
pnew = new RandomListNode(p->label);
p->next =pnew;
pnew->next=pnext;
p=pnext;
}
p=pHead;
while(p){
if(p->random){
p->next->random=p->random->next;
}
p=p->next->next;
}
p=pHead;
RandomListNode myHead(0);
RandomListNode * pstart=&myHead;
while(p){
pstart->next=p->next;
pstart=pstart->next;
pnext=p->next->next;
p->next=pnext;
p=pnext;
}
return myHead.next;
}
};