复杂链表的复制

题目:请实现函数,复制一个复杂链表。在复杂链表中,每一个节点除了有一个m_pNext指针指向下一个节点外,还有一个m_pSibling只想链表中的任意节点或者NULL。节点定义如下:

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

指向下一节点的指针(实现箭头),任意节点指针(虚线箭头)
方法:
第一步,根据原始链表的每一个节点N创建对应的N’,将N’连接在N的后面。如图
这里写图片描述
完成这一步的代码如下:

void CloneNodes(ComplexNode* pHead)  
{  
    ComplexNode* pNode = pHead;  
    while(pNode != NULL)  
    {  
        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;  
    }  
}  

第二部设置复制出来的节点m_pSibling。假设原始链表上的N的m_pSibling指向节点S,那么其对应复制出来的N’是N的m_pNext指向的结点,同样S’也是S的m_pNext指向的结点。设置m_pSibling之后的链表如图所示:
这里写图片描述
第二步代码如下:

void ConnectSiblingNodes(ComplexNode* pHead)  
{  
    ComplexNode* pNode = pHead;  
    while(pNode != NULL)                 //遍历链表更新随机指针  
    {  
        ComplexNode *pCloned = pNode->m_pNext;  
        if(pNode->m_pSibling != NULL)  
        {  
            pCloned->m_pSibling = pNode->m_pSibling->m_pNext;       //新复制结点的随机指针就是原始结点的随机指针指向的结点的下一个结点  
        }  
        pNode = pCloned->m_pNext;  
    }  
}  

第三步把这个长链表长分成两个链表:把奇书位置的结点用m_pNext连接起来就是原始链表,把偶数位置的结点用m_pNext连接起来就是复制出来的链表。如下图
这里写图片描述
对应代码如下:

ComplexNode* ReconnectNodes(ComplexNode* pHead)  
{  
    ComplexNode* pNode = pHead;  
    ComplexNode* pClonedHead = NULL;  
    ComplexNode* 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;  
}  

将上面三部整合起来,就是复制链表的完整过程。

ComplexNode* Clone(ComplexNode* pHead)  
{  
    CloneNodes( pHead );  
    ConnectSiblingNodes( pHead );  
    return ReconnectNodes( pHead );  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值