剑指Offer-26-复杂链表的复制-优化

原创 2015年11月21日 11:58:28

前面文章所使用的方法时间主要花费在定位结点的m_pSibling上面,我们试着在这方面去做优化。
我们还是分为两步:
第一步仍然是复制原始链表上的每个结点N,并创建N’,然后把这些创建出来的结点链接起来。这一次,我们把新创建的每个结点N’链接在原先结点N的后面。
这里写图片描述
代码如下:


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;
    }
}

第二步是设置我们复制出来的链表上的结点的m_pSibling。假设原始链表上的N的m_pSibling指向结点S,那么其对应复制出来的N’是N->m_pNext,同样S’也是S->m_pNext。这就是我们在上一步中把每个结点复制出来的结点链接在原始结点后面的原因。有了这样的链接方式,我们就能在O(1)中就能找到每个结点的m_pSibling了。代码如下:


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;
}

我们把上面三步合起来,就是复制链表的完整过程:

ComplexListNode* Clone(ComplexListNode *pHead) {
    CloneNodes(pHead);
    ConnectSiblingNodes(pHead);
    ComplexListNode *pClonedHead = ReconnectNodes(pHead);
    return pClonedHead;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

剑指Offer 26 复杂链表的复制

题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则...

剑指offer面试题26之复杂链表的复制问题

如果认定了目标就一直朝前走下去,每天多一点心得理解也是很开心的啦!

剑指offer 面试题26—复杂链表的复制

struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ...

剑指offer面试题26:复杂链表的复制Java实现

题目描述: 一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sbiling指向链表中的任意结点或者null。 下图是一个复杂链表的示例,Null的指针没...

剑指offer--面试题26:复杂链表的复制

 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节...

剑指offer--面试题26:复杂链表的复制--Java实现

题目描述:复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sbiling指向链表中的任意结点或者null。下图是一个复杂链表的示例,Null的指针没有画出。 ...

【剑指Offer学习】【面试题26:复杂链表的复制】

题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sib...

剑指offer面试题[26]-复杂链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引...

剑指Offer26:复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序...

剑指offer 面试题26复杂链表的复制

复制一个复杂链表。在复杂链表中,每个节点有next 指针指向下一个结点外,还有pSibling指向链表任何结点或者NULL。   根据作者思路实现这个需求,代码没有作者简洁。 #include ...
  • huruzun
  • huruzun
  • 2014年03月27日 15:30
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer-26-复杂链表的复制-优化
举报原因:
原因补充:

(最多只允许输入30个字)