1. 程式人生 > >連結串列:帶隨機指標的連結串列的深度複製

連結串列:帶隨機指標的連結串列的深度複製

    給定一個連結串列,該連結串列的每個節點帶有一個隨機指標,指向連結串列中的其他元素或者為null,要求對這個連結串列進行深度複製。

    分析:由於隨機指標指向任意元素,如何把原連結串列的隨機指標與新連結串列的隨機指標一一對應,是這個問題的關鍵。

    為了實現一一對應,需在新連結串列與原連結串列的節點之間建立相互的關係,因此,可以把新連結串列的節點一一的先複製到原連結串列的節點後,使每一個新節點都是原節點的next。複製完成之後,新節點的隨機指標需要指向的目標就是原節點的隨機指標的next。最後,在把兩個節點分開。

/**
 * Definition for singly-linked list with a random pointer.
 * class RandomListNode {
 *     int label;
 *     RandomListNode next, random;
 *     RandomListNode(int x) { this.label = x; }
 * };
 */
public class Solution {
   public RandomListNode copyRandomList(RandomListNode head) {
        if(head == null)
        	return null;
        RandomListNode curr = head;
        RandomListNode result = new RandomListNode(0);
        RandomListNode tail = result;
        while(curr != null){    //複製新元素,把新元素連結到原元素的next
        	RandomListNode copy = new RandomListNode(curr.label);
        	copy.next = curr.next;
        	curr.next = copy;
        	curr = copy.next;
        }
        curr = head;
        while(curr != null){    //新元素的random指向的目標,就是原元素的random所質量的目標的next
            if(curr.random == null)
                curr.next.random = null;
            else
        	    curr.next.random = curr.random.next;
        	curr = curr.next.next;
        }
        curr = head;
        while(curr != null){    //把新元素抽取出來,得到複製的連結串列
        	tail.next = curr.next;
        	tail = tail.next;
        	curr.next = tail.next;
        	curr = curr.next;
        }
        return result.next;
    }
}