Copy List with Random Pointer
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.copy node: copy every node and connect them right after corresponding original node.2.copy random: cause copy node is right after the original node, we can simply use node.next.random = node.random.next to copy random node.
3.split list: split the list into original list and the copied one.
/**
* 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 head;
copyNode(head);
copyRandom(head);
return splitList(head);
}
private void copyNode(RandomListNode head) {
RandomListNode p = head;
while (p != null) {
RandomListNode copy = new RandomListNode(p.label);
copy.next = p.next;
p.next = copy;
p = copy.next;
}
}
private void copyRandom(RandomListNode head) {
RandomListNode p = head;
while (p != null) {
if (p.random != null)
p.next.random = p.random.next;
p = p.next.next;
}
}
private RandomListNode splitList(RandomListNode head) {
RandomListNode newHead = head.next;
RandomListNode p = head;
while (p != null) {
RandomListNode copy = p.next;
p.next = copy.next;
p = p.next;
if (p != null)
copy.next = p.next;
}
return newHead;
}
}
/**
* 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 head;
copyNode(head);
copyRandom(head);
return splitList(head);
}
private void copyNode(RandomListNode head) {
RandomListNode p = head;
while (p != null) {
RandomListNode copy = new RandomListNode(p.label);
copy.next = p.next;
p.next = copy;
p = copy.next;
}
}
private void copyRandom(RandomListNode head) {
RandomListNode p = head;
while (p != null) {
if (p.random != null)
p.next.random = p.random.next;
p = p.next.next;
}
}
private RandomListNode splitList(RandomListNode head) {
RandomListNode newHead = head.next;
RandomListNode p = head;
while (p != null) {
RandomListNode copy = p.next;
p.next = copy.next;
p = p.next;
if (p != null)
copy.next = p.next;
}
return newHead;
}
}