复制带随机指针的链表(中等难度)

简介: 复制带随机指针的链表(中等难度)

题目概述(简单难度)

2.png2.png2.png




题目链接:

复制带随机指针的链表


思路与代码

思路展现

2.png

这个题目的意思就是我们的链表的每个节点不仅仅有一个next域,next域存储的下一个节点的地址,还有我们的random域,这个random域是随机的,意思就是这个域内存储的下一个节点的地址我们也不知道是哪个节点,random域可以为空,也可以不为空(存储非自身节点的某个节点的地址),也可以存储自己节点本身的地址,所以说当我们复制这个链表的时候,就需要将next域和我们的random域一起复制过去,并且不能发生改变,此时我们就需要仔细想想要怎么复制了,这块我们巧用我们的map集合,使用Map集合来存储我们的原链表和复制后的链表的地址.如下图所示:

2.png

所以这道题目的思路就非常明了了:

2.png

关于第二点的核心语句为:

2.png


代码示例

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null) {
            return null;
        }
        Node cur = head;
        HashMap<Node,Node> map = new HashMap<>();
        while(cur!=null) {
            Node node = new Node(cur.val);
            map.put(cur,node);
            cur = cur.next;
        }
        //cur == null  说明第一遍历结束了   map当中存储了映射关系
        //让cur此时重新指向链表的头节点
        cur = head;
        while(cur!=null) {
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
       //cur再次为空 此时说明 新的;链表的next和random已经维护完成
        //最后返回新链表的头节点
        return map.get(head);
    }
}

总结

时间复杂度:O(N):N为链表长度

空间复杂度:O(N):N为链表长度

相关文章
|
4月前
链表指针的传参,传值和传地址
本文讨论了链表操作中指针传参的问题,特别是指针的传值与传地址的区别,并提供了修正代码,以确保链表插入操作能正确地修改指针指向的地址。
28 1
链表指针的传参,传值和传地址
|
9月前
|
存储 C语言
用指针处理链表
用指针处理链表
81 3
|
4月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
33 0
|
4月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
56 0
|
7月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
66 1
【数据结构OJ题】复制带随机指针的链表
|
6月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
33 1
|
6月前
|
存储 算法 数据处理
指针与链表
指针与链表
105 0
|
8月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
9月前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
|
9月前
|
存储 缓存 搜索推荐
指针链表
指针链表
61 0

热门文章

最新文章