1. 程式人生 > >劍指offer----複雜連結串列的複製

劍指offer----複雜連結串列的複製

題目:

請實現函式ComplexListNode* Clone(ComplexListNode* pHead),複製一個複雜連結串列。

在複雜連結串列中,每個結點除了有一個pNext指標指向下一個結點之外,還有一個pSibling指向連結串列中的任意結點或者NULL。

結點的定義如下:

struct ComplexListNode{
    int val;
    ComplexListNode* pNext;
    ComplexListNode* pSibling;
};

思路:

  • 複製結點
  • 複製隨機指標
  • 重新連線複製的結點

假設給的複雜連結串列如下:

這裡寫圖片描述

複製結點

這裡寫圖片描述

複製隨機指標

這裡寫圖片描述

這裡寫圖片描述

重新連線複製的結點

這裡寫圖片描述

class Solution{
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        CloneAllNodes(pHead);//複製結點,並連線在複製的那個結點的後邊,它的下一個結點指向我們複製的結點的下一個結點
        CloneRandom(pHead);//複製隨機指標
        return ConnectAllNodes(pHead);//重新連線複製的結點
    }

    //複製結點,並連線在複製的那個結點的後邊,它的下一個結點指向我們複製的結點的下一個結點
void CloneAllNodes(RandomListNode* pHead) { RandomListNode* pClone; while (pHead != NULL) { pClone = new RandomListNode(pHead->label);//複製當前的結點 pClone->next = pHead->next;//連線 pHead->next = pClone; pHead = pClone->
next;//指標指向下一個複製的結點 } } //複製隨機指標 void CloneRandom(RandomListNode* pHead) { RandomListNode* pClone; while (pHead != NULL) { pClone = pHead->next;//指向複製的結點 if (pHead->random != NULL) { pClone->random = pHead->random->next;//複製的結點的值的random指向當前的結點的random的next結點 } pHead = pClone->next; } } //重新連線複製的結點 RandomListNode* ConnectAllNodes(RandomListNode* pHead) { RandomListNode* pNode = pHead;//指向當前結點的位置 RandomListNode* ClonepHead = NULL;//標記複製連結串列的頭部 RandomListNode* ClonepNode = NULL;//指向複製結點的當前位置 //先處理兩個連結串列的頭部 if (pNode != NULL) { ClonepNode = pNode->next; ClonepHead = pNode->next; pNode->next = ClonepHead->next; pNode = pNode->next; } while (pNode != NULL) { ClonepNode->next = pNode->next; ClonepNode = ClonepNode->next; pNode->next = ClonepNode->next; pNode = pNode->next; } return ClonepHead; } };