Copy List with Random Pointer
Total Accepted: 12884 Total Submissions: 56931A 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.
w/o extra space.
/**
* 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 p = head;
while(p!=null) {
RandomListNode np = new RandomListNode(p.label);
np.next = p.next;
p.next = np;
p = np.next;
}
p = head;
while(p!=null) {
p.next.random = p.random==null ? null : p.random.next;
p = p.next.next;
}
RandomListNode nhead = head.next;
p = head;
RandomListNode q = nhead;
while(p!=null) { // q.next !=null won't work, since it won't deal with one node situation.
p.next = q.next;
if(q.next!=null) q.next = q.next.next;
p = p.next;
q = q.next;
}
return nhead;
}
}
w/ extra space.
/**
* 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) {
HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
RandomListNode p = head;
while(p != null) {
RandomListNode newp = new RandomListNode(p.label);
map.put(p, newp);
p = p.next;
}
// RandomListNode newHead = map.get(head);
p = head;
while(p!=null) {
RandomListNode q = map.get(p);
q.next = map.get( p.next );
q.random = map.get(p.random);
p = p.next;
}
return map.get(head);
}
}