1. 程式人生 > >劍指offer題解C++【25】複雜連結串列的複製

劍指offer題解C++【25】複雜連結串列的複製

題目描述

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的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; } };