複雜鏈表的複製

輸入一個複雜鏈表(每一個節點中有節點值,以及兩個指針,一個指向下一個節點,另外一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,不然判題程序會直接返回空)html

結點結構體以下:dom

/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */

這是一道劍指offer上的題目。下面看一下解析吧。spa

在作這道題以前,本身的想法是先把鏈表中的next域所有複製,這時候原複雜鏈表的random域的全部指向都會存在於剛纔複製的鏈表中,以後再遍歷原複雜鏈表,將新鏈表random域與原鏈表random域相互對應便可。.net

可是過程當中問題就出現了,雖然我能夠在將原鏈表的全部next域所有複製,也保證了即將要複製的random域的指向存在於該鏈表中,可是random域是隨機指的,也就是說並不知道當前的random域指向的結點在前面仍是後面,如此一來,若是還要繼續下去,恐怕還要嵌套一層循環。指針

爲此,又在網上找了大神的博客參考下,真的是受益不淺。code

想一想咱們平時複製粘貼一段文字的時候是怎麼作的?是照着那段文字一個一個的再敲一次嗎?並非,很顯然,咱們是直接在該段文字上覆制,而後將複製後的文字粘貼到咱們想要的地方。htm

上面的笨辦法顯然就是一個一個的再敲一個鏈表出來,並無作真正的複製blog

那怎麼作?對,就是直接在原鏈表上覆制一份鏈表,最後將咱們想要的備份鏈表從原鏈表中抽離出來。get

具體分三個步驟:博客

1.再原鏈表的每一個結點後面插入一個與當前結點數據域相同的結點

2.複製random域的對應關係

3.抽離鏈表

完整代碼以下

RandomListNode* Clone(RandomListNode* pHead) { if(!pHead){ return NULL; } RandomListNode *head = NULL; RandomListNode *p, *pf = NULL; RandomListNode *q; // 先複製結點
        for(p = pHead; p; p = p->next->next){ q = new RandomListNode(p->label); q->next = p->next; p->next = q; } // 複製random域對應關係
        for(p = pHead; p; p = p->next->next){ if(!p->random){ p->next->random = p->random; }else{ p->next->random = p->random->next; } } //抽離鏈表
        head = pHead->next; for(p = pHead, q = head; q; q = q->next){ p->next = p->next->next; if(q->next){ p = p->next; q->next = q->next->next; } } return head; }

下面附一下參考連接,上面有圖,更容易理解。

http://www.javashuo.com/article/p-kducekdg-ky.html

end。

原文出處:https://www.cnblogs.com/GuoYuying/p/11478469.html

相關文章
相關標籤/搜索