復雜鏈表的復制

復雜鏈表的復制

輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制后復雜鏈表的head。

Paste_Image.png

代碼如下:

public class ComplexListCopy {
    

    
    public static RandomListNode clone(RandomListNode pHead){
        if(pHead == null){
            throw new NullPointerException();
        }
        
        RandomListNode pCur = pHead;
        RandomListNode pNext = pCur.next;
        
        //復制
        while(pNext != null){
            pCur.next = new RandomListNode(pCur.label);
            pCur.next.next = pNext;
            pCur = pNext;
            pNext = pNext.next;
        }
        //如果pNext==null,把pCurr.next指向他的復制品
        pCur.next = new RandomListNode(pCur.label);
        
        //構造random
        pCur = pHead;
        while(pCur != null){
            if(pCur.random != null){
                pCur.next.random = pCur.random.next;
            }
            pCur = pCur.next.next;
        }
        
        //拆分鏈表
        pCur = pHead;
        RandomListNode cHead = pCur.next;
        pNext = pCur.next.next;
        RandomListNode cTem = cHead;
        while(pNext != null){
            //當前的下一個指向pNext
            pCur.next = pNext;
            //復制品的下一個指向pNext.next(pNext存在,必然pNext.next存在(是pNext的復制品))
            cTem.next = pNext.next;
            //把cTem指向cTem.next
            cTem = cTem.next;
            //pCur指向pNext
            pCur = pNext;
            //pNext指向pNext.next.next(一個next是他的復制,再next才是實際上的next)
            pNext = pNext.next.next;
        }
        //不要漏掉這個,不然原鏈表最后會出現一個復制品
        pCur.next = null;
        
        return cHead;
        
    }

    //測試數據
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        RandomListNode root = new RandomListNode(1);
        RandomListNode root2 = new RandomListNode(2);
        RandomListNode root3 = new RandomListNode(3);
        RandomListNode root4 = new RandomListNode(4);
        RandomListNode root5 = new RandomListNode(5);
        RandomListNode root6 = new RandomListNode(6);
        
        root.next = root2;
        root2.next = root3;
        root3.next = root4;
        root4.next = root5;
        root5.next = root6;
        
        root4.random = root6;
        root.random = root6;
        root3.random = root;
                
        print(root);
        RandomListNode clone = clone(root);
        print(clone);
        
        
    }
    
    public static void print(RandomListNode node){
        RandomListNode tem = node;
        while(tem != null){
            System.out.print(tem.label + " " );
            if(tem.random != null){
                System.out.print(tem.random.label + " ");
            }
            tem = tem.next;
        }
        System.out.println("");

    }

}

class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果...
    鴻雁長飛光不度閱讀 269評論 0 0
  • 復雜鏈表的復制 題目描述 輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指...
    echoVic閱讀 737評論 0 1
  • 輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點)。返回一個...
    IT_Matters閱讀 1,804評論 0 1
  • 題目描述輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),...
    quiterr閱讀 320評論 0 0
  • 親愛的家人們早上好! 我是河南果子媽,我是一位初中數學教師,也是兩個孩子的媽媽,大寶七歲了,小寶一歲了。 人生中每...
    靜心137閱讀 457評論 0 1