题目描述:
请实现函数ComplexListNode *Clone(ComplexListNode *pHead),复制一个复杂链表。
在复杂链表中,每个节点除了一个指针指向下一个节点,还有一个指针m_pSibling指向链表中任意节点或者NULL。
节点的C++定义如下:
struct ComplexListNode
{
int m_nValue;
ComplexListNode *m_pNext;
ComplexListNode *m_pSibling;
};
思路:分而治之。
主要问题就是m_pSibling指针的定向问题,如何能够快速有效的定位是关键。
1)先将链表N个节点复制:每个复制节点接在源节点后面;
A -> A' -> B -> B' -> C -> C' -> D -> D' .....
2)完成m_pSibling指针的指向;
3)将整个链表拆开。
分三个函数分别完成三步操作:
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while(pNode != NULL)
{
ComplexListNode* pCloned = new ComplexListNode();
pCloned->m_nValue = pNode->m_nValue;
pCloned->m_pNext = pNode->m_pNext;
pCloned->m_pSibling = NULL;
pNode->m_pNext = pCloned;
pNode = pCloned->m_pNext;
}
}
void ConnectSiblingNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while(pNode != NULL)
{
ComplexListNode* pCloned = pNode->m_pNext;
if(pNode->m_pSibling != NULL)
{
pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
}
pNode = pCloned->m_pNext;
}
}
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pClonedHead = NULL;
ComplexListNode* pClonedNode = NULL;
if(pNode != NULL)
{
pClonedHead = pClonedNode = pNode->m_pNext;
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}
while(pNode != NULL)
{
pClonedNode->m_pNext = pNode->m_pNext;
pClonedNode = pClonedNode->m_pNext;
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}
return pClonedHead;
}
合并:
ComplextListNode *Clone(ComplexListNode *pHead)
{
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
ReconnectNodes(pHead);
}