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.
经典问题。分三步,很巧妙。
1. 在原链表的每个node后面插入一个与这个node具有相同值的node,即将原链表复制一遍。这一步相当于对原链表中的node和next指针进行了deep copy。
2. 拷贝random指针。这里是这个算法的精华所在,一言以蔽之,temp.next.random = temp.random.next。
3. 将deep copy的list从原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) {
if(head==null) return head;
insertNode(head);
copyRandomPointer(head);
return getCopyList(head);
}
public void insertNode(RandomListNode head) {
RandomListNode temp = head;
while(temp != null) {
RandomListNode copyNode = new RandomListNode(temp.label);
copyNode.next = temp.next;
temp.next = copyNode;
temp = temp.next.next;
}
return;
}
public void copyRandomPointer(RandomListNode head) {
RandomListNode temp = head;
while(temp != null) {
if(temp.random==null) temp.next.random=null;
else temp.next.random=temp.random.next;
temp = temp.next.next;
}
return;
}
public RandomListNode getCopyList(RandomListNode head) {
RandomListNode copyList=new RandomListNode(-1), temp=head, copy=copyList;
while(temp != null) {
copy.next = temp.next;
copy = copy.next;
temp.next = copy.next;
copy.next = null;
temp = temp.next;
}
return copyList.next;
}
}