複雜鏈表的複製

解題思路:

過程分爲三步:
首先,遍歷鏈表,複製當前結點currentNode對應的結點cloneCurNode,並將cloneCurNode放置在currentNode的後面,這樣就形成一條包含原始鏈以及複製鏈的長鏈。

這裏寫圖片描述

然後,還需將原始鏈中指針的方向賦予複製鏈

這裏寫圖片描述

最後,將長鏈拆分,就得到原始鏈和複製鏈了。
這裏寫圖片描述

/*
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 NULL;
        RandomListNode* pNode = pHead;
        RandomListNode* nextNode = pNode->next;
        while(pNode)
        {
            RandomListNode* temp = new RandomListNode(pNode->label);
            pNode->next = temp;
            temp->next = nextNode;
            pNode = temp->next;
            if(pNode)                         //處理本身鏈表只有一個結點和遍歷到最後一個節點的情況
            {
                nextNode = pNode->next;      
            }
        }

        pNode = pHead;         //開始處理隨機指針
        while(pNode)
        {
            if(!pNode->random)
            {
                pNode->next->random = NULL;
            }   
            else 
                pNode->next->random = pNode->random->next;
            pNode = pNode->next->next;
        }

        //開始拆分鏈表
        RandomListNode* CloneList = pHead->next;
        RandomListNode* CloneNode = CloneList;
        pNode = pHead;
        while(pNode)
        {
            pNode->next = CloneNode->next;
            pNode = pNode->next;
            if(pNode)   //處理鏈表只有一個節點和到最後一個節點
            {
                CloneNode->next = pNode->next;   
                CloneNode = CloneNode->next;
            }
        }

        return CloneList;
    }
};
發佈了40 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章