劍指offer----複雜連結串列的複製
阿新 • • 發佈:2019-02-20
題目:
請實現函式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;
}
};