剑指offer-第四章解决面试题思路(复杂链表的复制)

题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制。

复杂链表的数据结构如下:public class ComplexListNode{int m_nValue;ComplexListNode m_pNext;ComplexListNode m_pSliping//指向链表中的任何一个节点}

例如:m_pSliping指向NUll的,并没有画出来。

将复杂的问题简单化,各个击破:

思路:第一步,就是复制节点,并连接到原始节点的后面,第二步,设置复制出来节点的m_pSliping.第三步,将复制的链表从原始链表中分离。

如图:

Java代码:

public class ComplexLinkCloned {
    //对于复杂链表的复制问题:1、复制节点,并连接到原始节点的后面。2.设置复制出来节点的m_pSliping。
    //3.将复制的链表从原始的链表中分离出来。
    public class ComplexListNode{
        int m_nValue;
        ComplexListNode m_pNext;
        ComplexListNode m_pSliping;
    }
    //复制节点
    public void clonedNode(ComplexListNode pHead){
        if(pHead==null)
            return;
        ComplexListNode pNode=pHead;
        while(pNode!=null){
            ComplexListNode pClonedNode=new ComplexListNode();
            pClonedNode.m_nValue=pNode.m_nValue;
            pClonedNode.m_pNext=pNode.m_pNext;
            pClonedNode.m_pSliping=null;
            pNode.m_pNext=pClonedNode;
            pNode=pClonedNode.m_pNext;
        }
    }
    //设置m_pSliping
    public void connectSlipingNode(ComplexListNode pHead){
        if(pHead==null)
            return;
        ComplexListNode pNode=pHead;
        while(pNode!=null){
            ComplexListNode pCloned=pNode.m_pNext;
            if(pNode.m_pSliping!=null){
                pCloned.m_pSliping=pNode.m_pSliping.m_pNext;
            }
            pNode=pCloned.m_pNext;
        }
        
    }
     //将复制的链表从整个链表中分离
    public ComplexListNode reConnectNode(ComplexListNode pHead){
        ComplexListNode pNode=pHead;
        ComplexListNode pClonedNode=null;
        ComplexListNode pClonedHead=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;
    }
    public ComplexListNode Clone(ComplexListNode pHead){
        clonedNode(pHead);
        connectSlipingNode(pHead);
        return reConnectNode(pHead);
    }
   
}
原文地址:https://www.cnblogs.com/hupp/p/4742152.html