複製鏈表的複製

題目:

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

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

基本思想:

分爲三步:

  • 複製原始鏈表的任意節點N並創建新節點N,再把N’鏈接到N的後面

這裏寫圖片描述

  • 設置複製出來的結點的random指針,即爲原始鏈表N上的random的指針的next.

這裏寫圖片描述

  • 拆分鏈表,奇數位置的結點鏈接起來的鏈表就是複製的鏈表。

代碼如下:

RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead==NULL) return NULL;
        RandomListNode *pNode=pHead;
        //複製
        while(pNode)
        {
            RandomListNode* pClonednode=new RandomListNode(pNode->label);
            pClonednode->next=pNode->next;
            pClonednode->random=NULL;

            pNode->next=pClonednode;
            pNode=pClonednode->next;
        }
        //複製random
        pNode=pHead;
        while(pNode)
        {
            RandomListNode* node=pNode->next;
            if(pNode->random)
                node->random=pNode->random->next;
            pNode=node->next;
        }
        //拆分,每隔一個結點拆一個
        RandomListNode *pCloneHead=pHead->next;
        RandomListNode *CurNode=NULL;
        pNode=pHead; 
        while(pNode->next)
        {
            CurNode=pNode->next;
            pNode->next=CurNode->next;
            pNode=CurNode;
        }
        return pCloneHead;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章