複雜鏈表的複製

題目描述

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

題目分析

在牛客網討論區的圖:

在這裏插入圖片描述

這樣的好處是在第二遍遍歷時,複製random比較方便,寫爲
node->random = p->random->next;
/*
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 nullptr;
        RandomListNode *p, *n, *nHead, *node;
        p = pHead;
        while(p){
            node = new RandomListNode(p->label);
            node->next = p->next;
            p->next = node;
            p = node->next;
        }
        p = pHead;
        //while(n){
            //n->random = p->random->next;
            //p = n->next;
            //n = p->next;
            //出錯:A->A',則p = null, n = null->next導致錯誤
        //}
        while(p){
            n = p->next;
            if(p->random) //保證random不是指向空節點
                n->random = p->random->next;
            p = n->next;
        }
        p = pHead;
        n = p->next;
        nHead = n;
        //此處條件爲p->next,當A->A'時,若條件爲n,將無法拆分
        while(p->next){
            n = p->next;
            p->next = n->next;
            //p = p->next;
            //n->next = p->next;
            //n = n->next;
            p = n;
        }
        return nHead;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章