A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
Solution:
1 /** 2 * Definition for singly-linked list with a random pointer. 3 * class RandomListNode { 4 * int label; 5 * RandomListNode next, random; 6 * RandomListNode(int x) { this.label = x; } 7 * }; 8 */ 9 public class Solution { 10 public RandomListNode copyRandomList(RandomListNode head) { 11 Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>(); 12 if (head==null) return null; 13 14 RandomListNode head2 = new RandomListNode(head.label); 15 map.put(head,head2); 16 RandomListNode cur = head2; 17 18 while (head!=null){ 19 RandomListNode rand1 = head.random; 20 if (rand1!=null && map.containsKey(rand1)){ 21 cur.random = map.get(rand1); 22 } else if (rand1!=null) { 23 RandomListNode rand2 = new RandomListNode(rand1.label); 24 map.put(rand1,rand2); 25 cur.random = rand2; 26 } 27 28 if (head.next==null){ 29 cur.next=null; 30 } else { 31 RandomListNode next = head.next; 32 if (map.containsKey(next)) 33 cur.next = map.get(next); 34 else { 35 RandomListNode next2 = new RandomListNode(next.label); 36 cur.next = next2; 37 map.put(next,next2); 38 } 39 } 40 41 head = head.next; 42 cur = cur.next; 43 } 44 45 return head2; 46 } 47 }