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.
/** * 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) { RandomListNode newHead = new RandomListNode(0); Map<RandomListNode, RandomListNode> oldToNew = new HashMap<RandomListNode, RandomListNode>(); Map<RandomListNode, RandomListNode> newToOld = new HashMap<RandomListNode, RandomListNode>(); if(head != null){ RandomListNode nextNode = head; RandomListNode nextNewNode = newHead; while(nextNode != null){ nextNewNode.next = new RandomListNode(nextNode.label); nextNewNode = nextNewNode.next; oldToNew.put(nextNode, nextNewNode); newToOld.put(nextNewNode, nextNode); nextNode = nextNode.next; } nextNewNode.next = null; nextNewNode = newHead.next; while(nextNewNode != null){ RandomListNode tempOld = newToOld.get(nextNewNode); RandomListNode tempnew = oldToNew.get(tempOld.random); nextNewNode.random = tempnew; nextNewNode = nextNewNode.next; } } newHead = newHead.next; return newHead; } }