連結串列:帶隨機指標的連結串列的深度複製
阿新 • • 發佈:2019-02-08
給定一個連結串列,該連結串列的每個節點帶有一個隨機指標,指向連結串列中的其他元素或者為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; } }