《劍指offer》第26題 複雜鏈表的複製(Java版答案)

題目:

複製一個複雜鏈表。複雜鏈表中,每個結點除了有一個指針指向下一個結點外,還有一個指針可以指向鏈表中的任意一個結點或者null。

答案:

分三步

1.根據原來的鏈表的每個結點N,創建對應的N',並將N'連接在N後面,組成一個鏈表

2.對每個N'結點設置副結點,副結點爲其前面結點N指向的副結點S,對應的next節點S’

3.拆分新舊鏈表,返回新鏈表,第一個N節點的下一個結點N'即爲新鏈表的頭結點,將N的next節點指向N'的next節點,完成拆分。

 

    public ComplexListNode cloneComplexListNode(ComplexListNode head) {
        if (head == null){
            return null;
        }
        //1.根據原來的鏈表的每個結點N,創建對應的N',並將N'連接在N後面
        cloneNode(head);
        //2.設置副結點
        setSibling(head);
        //3.拆分新舊鏈表,返回新鏈表
        return getNewListNode(head);
    }


    private void cloneNode(ComplexListNode head) {
        ComplexListNode p = head;
        while (p != null) {
            ComplexListNode cloneNode = new ComplexListNode(p.value);
            cloneNode.next = p.next;
            p.next = cloneNode;
            p = cloneNode.next;
        }
    }


    private void setSibling(ComplexListNode head) {
        ComplexListNode p = head;
        while (p != null) {
            ComplexListNode cloneNode = p.next;
            if (p.sibling != null) {
                cloneNode.sibling = p.sibling.next;
            }

            p = cloneNode.next;
        }

    }

    private ComplexListNode getNewListNode(ComplexListNode head) {
        ComplexListNode newHead = head.next;

        ComplexListNode p = head;
        while (p != null) {
            ComplexListNode cloneNode = p.next;
            p.next = cloneNode.next;

            if (p.next != null) {
                cloneNode.next = cloneNode.next.next;
                p = p.next;
            }
        }

        return newHead;
    }

關鍵點:

找到N'對應的副結點

方法二:藉助空間,map保存每個舊節點N對應的新複製節點N'。

1.首先通過節點N複製N'時,先將其副結點設置爲S,並用map保存N對應的新複製節點N'的關係。

2.重新設置副結點N'時,由於原來的副結點是S,通過map就可以找到S對應的複製結點S',將N'的副結點設置爲S',完成複製。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章