这个题目自己一开始没有想出来,复制一个链表容易,但是随机指针需要随机定位节点,所以可以把新老节点交叉连在一起。设置完随机指针后断开即可。
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null)return null;
RandomListNode tmp;
RandomListNode h=head;
while(head!=null){
tmp = new RandomListNode(head.label);
tmp.next=head.next;
head.next=tmp;
head=tmp.next;
}
head=h;
while(head.next!=null){
if(head.random!=null)head.next.random=head.random.next;
head=head.next.next;
if(head==null)break;
}
RandomListNode s1=h;
RandomListNode s2=h.next;
h=s2;
while(s2.next!=null){
s1.next=s2.next;
s2.next=s2.next.next;
s1=s1.next;
s2=s2.next;
}
s1.next=null;
return h;
}
Update 2015/08/20: 面试的时候问到过这道题,于是在熟练地用上面的解法做完之后,面试官问能不能不修改原始链表。于是只能用hashmap重新写,思路就是使用map的K-V储存新-旧节点即可。