剑指Offer35.复杂链表的复制

复杂链表的复制

在这里插入图片描述
代码思路:
给定链表的头结点head,复制普通链表很简单,只需遍历链表,每轮建立新节点+构建前驱节点pre和当前节点node的引用指向即可。
本题链表的节点新增了 random指针,指向链表中的任意节点或者null,
random意味着在复制过程中,除了维护pre.next还要维护pre.random.
方法一:哈希表
利用哈希表的查询特点,考虑构建原链表节点和新链表节点的键值对映射关系,在遍历构建新链表各结点的next和random引用指向即可。
算法流程:
1.若头结点head为空,返回null;
2.初始化 哈希表map, 节点cur指向头结点
3.复制链表
1.建立新节点,并向dic添加键值对(原cur节点,新cur节点);
2.cur遍历至原链表的下一节点;
4.构建新链表的引用指向
1.构建新节点的next和random引用指向
2.cur遍历至原链表的下一节点。
5.新链表的头结点 map.get(head)
复杂度分析
时间复杂度O(N):两轮遍历链表,使用O(N)时间
空间复杂度O(N):哈希表map使用线性大小的额外内存空间

package LeeCode2;

import java.util.HashMap;

class Node{
    int val;
   Node next;
    Node random;
    public Node(int val){
        this.val=val;
        this.next = null;
        this.random=null;
    }
}
public class Day1021 {
    public Node copyRandomList(Node head){
        if(head==null) return null;
        HashMap<Node,Node> map=new HashMap<>();
        Node cur=head;
        //复制节点到map中
        while(cur!=null){
            map.put(cur,new Node(cur.val));
            cur=cur.next;
        }
        head=cur;
        //构建新链表的next和Random指向
        while(cur!=null){
            map.get(cur).next=map.get(cur.next);
            map.get(cur).random=map.get(cur.random);
            cur=cur.next;
        }
        return map.get(head);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值