这个题目自己一开始没有想出来,复制一个链表容易,但是随机指针需要随机定位节点,所以可以把新老节点交叉连在一起。设置完随机指针后断开即可。
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储存新-旧节点即可。
本文深入探讨了链表复制问题,特别是如何在复制过程中为节点添加随机指针并实现其指向随机选择的节点。通过实例代码展示了基本解法,并进一步提出使用哈希表优化内存效率的解决方案。详细解析了每一步的操作逻辑及其背后的原理。
1291

被折叠的 条评论
为什么被折叠?



