本人电子系,只为一学生。心喜计算机,小编以怡情。
给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。
解答思路:既然给了一个random指针,那么就要充分利用。因为是深拷贝,那么我们就要new一个新的节点,让原先的random指向它。
当然,random要保存起来,我选择的用ArrayList来保存。
public RandomListNode copyRandomList(RandomListNode head) {
// write your code here
if(head==null) return null;
ArrayList<RandomListNode> ran=new ArrayList<>();//用于保存Random
RandomListNode temp=head;
while(temp!=null)
{
RandomListNode linshi=new RandomListNode(temp.label);//建立新的节点
ran.add(temp.random);//并将旧的random保存(为了之后的赋值)
temp.random=linshi;//random指向新的节点
temp=temp.next;
}
temp=head;
while(temp!=null)
{
if(temp.next==null)//处理最后一个节点
{
temp.random.next=null;
break;
}
temp.random.next=temp.next.random;//让新的节点间彼此建立联系
temp=temp.next;
}
RandomListNode ret=head.random;//建立返回的头结点
temp=ret;
int i=0;
while(temp!=null)
{
temp.random=ran.get(i++);//新的也要有同样random,
//虽然原来的random被破坏了
//然而你也可以加一句head.random=ran.get(i++)来恢复
temp=temp.next;
}
return ret;
}