复杂链表的赋值
多拥有一个随机指针的链表的复制
基本思路是先复制一遍普通的节点,第二遍遍历复制随机指针,但找到随机节点需要再遍历一遍链表,也就是复制每个节点都需要遍历一遍,则复杂度为O(n2)
第二种思路是用空间换时间,来快速定位随机节点的位置,也就是用一个哈希表(或者是map)来存储这个节点对应的随机节点,这样复杂度就是O(1)
第三种思路就是在不使用辅助空间的情况下完成O(n)的复杂度。
第一遍遍历是创建新的节点之后将这个节点直接连到原节点后面
第二遍遍历设置复制节点的随机指针,这个时候就非常好找节点,因为它就跟在原随机节点的后面。注意node.random!=null时才赋值
第三遍遍历设置节点的next指针,类似上面的。最后返回复制链表头结点。
这里要注意的是因为要让node.next等于真正的next,所以创建一个节点来保存复制节点。第一步就令node的next等于next.next。赋值也要注意next.next是否为null。
class Solution {
public Node copyRandomList(Node head) {
if(head==null){
return null;
}
Node node=head;
while(node!=null){
Node copy=new Node(node.val);
copy.next=node.next;
node.next=copy;
node=copy.next;
}
node=head;
while(node!=null){
if(node.random!=null){
node.next.random=node.random.next;
}
node=node.next.next;
}
node=head;
Node root=head.next;//保存复制节点头结点
Node next;
while(node!=null){
next=node.next.next;
node.next.next=next==null?null:next.next;
node.next=next;
node=next;
}
return root;
}
}