题目:
请实现函数ComplexListNode* Clone(ComplexListNode* pHead);复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext指针指向下一个节点外,还有一个m_pSibling指向链表中的任意节点或者NULL。节点的C++定义如下:
struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
实现代码:
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pClone = new ComplexListNode();
pClone->m_nValue = pNode->m_nValue;
pClone->m_pNext = pNode->m_pNext;
pClone->m_pSibling = nullptr;
pNode->m_pNext = pClone;
pNode = pClone->m_pNext;
}
}
void ConnectSiblingNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pClone = pNode->m_pNext;
if (pNode->m_pSibling != nullptr) pClone->m_pSibling = pNode->m_pSibling->m_pNext;
pNode = pClone->m_pNext;
}
}
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pCloneNode = pNode->m_pNext;
ComplexListNode* pCloneHead = pCloneNode; // 克隆链表的头节点
pNode->m_pNext = pCloneNode->m_pNext;
pNode = pNode->m_pNext;
while (pNode != nullptr)
{
pCloneNode->m_pNext = pNode->m_pNext;
pCloneNode = pCloneHead->m_pNext;
pNode->m_pNext = pCloneNode->m_pNext;
pNode = pNode->m_pNext;
}
return pCloneHead;
}
ComplexListNode* Clone(ComplexListNode* pHead)
{
if (nullptr == pHead) return nullptr;
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
return ReconnectNodes(pHead);
}