1. 程式人生 > >劍指offer:複雜連結串列的複製(java)

劍指offer:複雜連結串列的複製(java)

public class Solution {
    public ComplexListNode Clone(ComplexListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        //複製接結點
        CloneNodes(pHead);

        //連線隨機指標
        ConnectSiblingNodes(pHead);

        //拆分連結串列
        return ReconnectNodes(pHead);

    }
    public static void CloneNodes(ComplexListNode pHead){
        ComplexListNode pNode = pHead;
        while(pNode != null){
            ComplexListNode pCloned = new ComplexListNode(pNode.label);
            pCloned.m_pnext = pNode.m_pnext;
            pCloned.m_pSibling = null;

            pNode.m_pnext = pCloned;
            pNode = pCloned.m_pnext;
        }


    }
    public static void ConnectSiblingNodes(ComplexListNode pHead){
        RandomListNode pNode = pHead;
        while(pNode != null){
            ComplexListNode pCloned = pNode.m_pnext;
            if(pNode.m_pSibling != null){
                pCloned.m_pSibling = pNode.m_Sibling.m_pnext;
            }

            pNode = pCloned.m_pnext;
        }
    }
    public static 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_next = pNode.m_next;
            pClonedNode = pClonedNode.m_pnext;
            pNode.m_pnext = pClonedNode.m_pnext;
            pNode = pNode.m_pnext;
        }

        return pClonedHead;
    }
}