劍指offer 面試題35 複雜鏈表的複製

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

tips: 分爲三步
1.把list擴充爲兩倍(每個元素後面產生一個複製的元素)
2.對複製出來的元素構建random指針
3.拆分爲兩個相同的鏈表

時間複雜度O(n), 且不需要額外的輔助空間

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;
        // 把list擴充爲兩倍(每個元素後面產生一個複製的元素)
        while (pNode!=NULL)
        {
            RandomListNode* pNext=pNode->next;
            pNode->next=new RandomListNode(pNode->label);
            pNode->next->next=pNext;
            pNode=pNext;
        }
        //對複製出來的元素構建random指針
        pNode=pHead;
        while (pNode!=NULL)
        {
            if(pNode->random!=NULL) {
                pNode->next->random=pNode->random->next;
            } else {
                pNode->next->random=NULL;
            }
            pNode=pNode->next->next;
        }
        //拆分爲兩個鏈表
        pNode=pHead;
        RandomListNode* clone=new RandomListNode(-1);
        RandomListNode* pCloneNode=clone;
        while (pNode!=NULL)
        {
            pCloneNode->next=pNode->next;
            pCloneNode=pCloneNode->next;
            pNode->next=pNode->next->next;
            pNode=pNode->next;
        }
        return clone->next;
    }
};

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