剑指offer35.复杂链表复制

题目传送门

解题思路


不得不说,大佬的代码对我这种小白来说就是一种恩赐啊。用的是哈希表进行操作的。
利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。

算法流程:
若头节点head为空节点,直接返回 null;
初始化: 哈希表 dic , 节点 cur 指向头节点;
复制链表:
建立新节点,并向 dic 添加键值对 (原 cur 节点, 新 cur 节点) ;
cur 遍历至原链表下一节点;
构建新链表的引用指向:
构建新节点的 next 和 random 引用指向;
cur 遍历至原链表下一节点;
返回值: 新链表的头节点 dic[cur] ;
复杂度分析:
时间复杂度 O(N)O(N) : 两轮遍历链表,使用 O(N)O(N) 时间。
空间复杂度 O(N)O(N) : 哈希表 dic 使用线性大小的额外空间。

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null) return null;//头结点为空直接返回,防止出现空指针异常
        Node cur=new Node(head.val);
        cur=head;
         Map<Node,Node> map=new HashMap<>();
        //    Map<Node, Node> map = new HashMap<>();
        while(cur!=null){
            map.put(cur, new Node(cur.val));
            cur=cur.next;
        }//这里完成的是普通的复制。
        cur=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);//因为是旧节点映射新节点,所以直接使用map通过head(一直没动)找到新节点的起始位置,然后直接返回就可以。

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值