1. 程式人生 > 其它 >leetcode刷題-劍指offer-35題

leetcode刷題-劍指offer-35題

leetcode刷題-劍指offer-35題

題目

請實現 copyRandomList 函式,複製一個複雜連結串列。在複雜連結串列中,每個節點除了有一個 next 指標指向下一個節點,還有一個 random 指標指向連結串列中的任意節點或者 null

示例 1:

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]

示例 3:

輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]

示例 4:

輸入:head = []
輸出:[]
解釋:給定的連結串列為空(空指標),因此返回 null。

解答

新手上路,才學疏淺,望斧正

  1. 先複製節點,再複製節點中的random
  2. 先把每個節點(假設為A)複製一份,放在它的後面(假設為 A1 )。
  3. 再 複製random 即A1的random 為 A的random(假設為B)的後一個節點(假設為B1)
  4. 將新節點(A1 , B1 ,,,)拆出來即可
class Solution3 {
    public Node copyRandomList(Node head) {
        if(head == null){
            return null;
        }

        //在每個節點後複製一份它自己
        Node p = head;
        while (p != null){
            Node tem = new Node(p.val);
            tem.next = p.next;
            p.next = tem;
            p = tem.next;
        }

        //複製ramdom 節點
        p = head;
        while (p != null){
            if(p.random == null) {
                p.next.random = null;
            }else {
                p.next.random = p.random.next;
            }
            p = p.next.next;
        }

        p = head;
        Node res = null;
        Node q=null;
        while (p != null){
            if(res == null){
                res = p.next;
                p.next = p.next.next;
                q = res;
            }else {
                q.next = p.next;
                p.next = p.next.next;
                q = q.next;
            }
            p = p.next;
        }

        return res;

    }
}