复杂链表的复制138

复杂链表的赋值

多拥有一个随机指针的链表的复制
基本思路是先复制一遍普通的节点,第二遍遍历复制随机指针,但找到随机节点需要再遍历一遍链表,也就是复制每个节点都需要遍历一遍,则复杂度为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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值