题目:
实现函数ComplexListNode* Clone(ComplexListNode* pHead), 复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL.结点定义如下:
struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
如图,虚线为m_pSibling指针,没显示的表示指向NULL.
思路:
1. 从头结点开始复制每个结点,并且把每个结点连在当前结点后面.
2. 修改克隆结点的m_pSibling指针
3. 拆链表,反回克隆链表的头指针
//复制原始链表的每个结点.并且新的结点都连到原始链表当前结点的后面
//新节点的m_pSibling先置空
void CloneNodes(ComplexListNode* pHead)
{
if (pHead == NULL)
return;
ComplexListNode* pNow = pHead;
while (pNow)
{
ComplexListNode* pClone = new ComplexListNode(0);
pClone->m_pNext = pNow->m_pNext;
pClone->m_pSibling = NULL;
pNow->m_pNext = pClone;
pNow = pClone->m_pNext;
}
}
//克隆m_pSibling
void CloneSibling(ComplexListNode* pHead)
{
ComplexListNode* pNow = pHead;
while (pNow)
{
ComplexListNode* pClone = pNow->m_pNext;
if (pNow->m_pSibling)
{
pClone->m_pSibling = pNow->m_pSibling->m_pNext;
}
pNow = pClone->m_pNext;
}
}
//拆链表,返回新链表
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNow = pHead;
ComplexListNode* pCloneHead = NULL;
ComplexListNode* pClone = NULL;
if (pNow)
{
pCloneHead = pNow->m_pNext;
pClone = pNow->m_pNext;
pNow->m_pNext = pClone->m_pNext;
pNow = pNow->m_pNext;
}
while (pNow)
{
pClone->m_pNext = pNow->m_pNext;
pClone = pClone->m_pNext;
pNow->m_pNext = pClone->m_pNext;
pNow = pNow->m_pNext;
}
return pCloneHead;
}
ComplexListNode* Clone(ComplexListNode* pHead)
{
CloneNodes(pHead);
CloneSibling(pHead);
ComplexListNode* pChead = ReconnectNodes(pHead);
return pChead;
}