复杂链表的复制(剑指offer)

题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode *Clone(ComplexNode *pHead),以复制一个复杂链表。

struct ComplexNode
{
    int m_nValue;
    ComplexNode* m_pNext;
    ComplexNode* m_pSibling;
};

void CloneNodes(ComplexNode *pHead)
{
    ComplexNode *pNode=pHead;
    while(pNode)
    {
        ComplexNode *pCloned=new ComplexNode;
        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(ComplexNode *pHead)
{
    ComplexNode *pNode=pHead,*pCloned;
    while(pNode)
    {
        pCloned=pNode->m_pNext;
        if(pNode->m_pSibling)pCloned->m_pSibling=pNode->m_pSibling;
        pNode=pCloned->m_pNext;
    }
}

ComplexNode *ReconnectNodes(ComplexNode *pHead)
{
    if(!pHead)return NULL;
    ComplexNode *pNode=pHead,*pClonedHead=pHead->m_pNext,*pClonedNode=pClonedHead;
    while(pClonedNode->m_pNext)
    {
        pNode->m_pNext=pClonedNode->m_pNext;
        pNode=pNode->m_pNext;
        pClonedNode->m_pNext=pNode->m_pNext;
        pClonedNode=pClonedNode->m_pNext;
    }
    return pClonedHead;
}

ComplexNode *Clone(ComplexNode *pHead)
{
    CloneNodes(pHead);
    ConnectSiblingNodes(pHead);
    return ReconnectNodes(pHead);
}




你可能感兴趣的:(复杂链表的复制(剑指offer))