【链表】Leetcode 138. 随机链表的复制【中等】

news2024/9/19 11:09:26

随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

你的代码 只 接受原链表的头节点 head 作为传入参数。

示例 1:
在这里插入图片描述
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

解题思路

  • 使用哈希表来存储原链表节点和复制链表节点的对应关系。

  • 第一次遍历:创建新节点并构建原链表节点和新节点的映射关系。同时,复制节点的 val 值和 next 指针。

  • 第二次遍历:根据原链表的 random 指针,为复制链表的对应节点设置 random 指针。

java实现

class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}

public class DeepCopyLinkedList {
    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }

        // 第一次遍历:创建新节点并构建原链表节点和新节点的映射关系
        Map<Node, Node> map = new HashMap<>();
        Node current = head;

        while (current != null) {
            map.put(current, new Node(current.val));
            current = current.next;
        }

        // 第二次遍历:根据原链表的 random 指针,为复制链表的对应节点设置 random 指针
        current = head;
        while (current != null) {
            Node copyNode = map.get(current);
            copyNode.next = map.get(current.next);
            copyNode.random = map.get(current.random);
            current = current.next;
        }

        return map.get(head);
    }

    public static void main(String[] args) {
        // 构造链表 1 -> 2 -> 3 -> 4 -> 5
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);
        head.next.next.next.next = new Node(5);

        // 设置 random 指针
        head.random = head.next.next;  // 1.random --> 3
        head.next.random = head.next.next.next;  // 2.random --> 4
        head.next.next.random = head;  // 3.random --> 1
        head.next.next.next.random = null;  // 4.random --> null
        head.next.next.next.next.random = head.next;  // 5.random --> 2

        // 调用 copyRandomList 方法进行深拷贝
        DeepCopyLinkedList solution = new DeepCopyLinkedList();
        Node copiedHead = solution.copyRandomList(head);

        // 打印复制链表
        while (copiedHead != null) {
            System.out.print("[" + copiedHead.val +
                             ", " + (copiedHead.random != null ? copiedHead.random.val : "null") +
                             "] ");
            copiedHead = copiedHead.next;
        }
        // 输出:[1, 3] [2, 4] [3, 1] [4, null] [5, 2]
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(n),需要额外的空间存储新节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

代码签名证书被吊销的原因及其后果是什么?

代码签名证书是确保软件代码完整性和可信度的关键工具&#xff0c;然而&#xff0c;在某些情况下&#xff0c;此类证书可能会被撤销。这意味着证书颁发机构&#xff08;CA&#xff09;不再认可该证书的有效性&#xff0c;并宣布其失效。本文将解析导致代码签名证书撤销的原因、…

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

&#x1f680; 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范&#xff1a; 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 &#x1f514; 重大变更 工作空间设置中的「数据访问…

puppeteer使用示例云顶之弈官网

自己从0到1开发的&#xff0c;微信小程序【云顶宝藏】求求点个5星好评吧&#xff01; 需求&#xff1a;拿到所有英雄的信息 思路&#xff1a;点击每个英雄&#xff0c;进入英雄详情页&#xff0c;拿信息&#xff0c;并返回&#xff0c;继续下一个英雄** 最终效果 本地环境 win…

【链表】Leetcode 148. 排序链表【中等】

排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 解题思路 对链表进行升序排序&#xff0c;可以使用归并排序&#xff08;Merge Sort&#xff09;的…

vben admin上线后接口调用成功,控制台报promise错误

vben admin上线后接口调用成功&#xff0c;控制台报promise错误 问题原因 vben admin框架对返回的数据格式做了统一处理&#xff0c;不满足格式要求的接口返回直接抛异常。 解决方案 将返回参数校验关闭&#xff0c;重新打包部署。

windowsVMware虚拟机中扩展linux磁盘空间

1.虚拟磁盘扩容 VM中&#xff0c;关闭linux虚拟机&#xff0c;直接编辑虚拟机-硬盘-扩展磁盘容量 2.通过Gparted工具进行LINUX系统磁盘分区 未分区挂载前可以看到/挂载点下空间为20G&#xff1a; 通过虚拟机-快照-拍摄快照&#xff0c;操作前可拍摄快照&#xff08;便于恢复之前…

Elasticsearch数据写入、检索流程及底层原理全方位解析

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 ✍&#x1f3fb;序言✍&#x1f3fb;1️⃣✍&#x1f3fb;es的架构简介1. 分布式架构2. 索引与搜索3. 数据写入与持久化4. 缓…

酷开科技以内容技术服务和数字营销服务为核心,自主研发酷开系统

家庭场景的需求&#xff0c;才是大屏电视的目的。屏幕越大得到的画幕越大&#xff0c;消费者也就看的越清楚&#xff0c;从而获得更好的观看体验&#xff0c;尤其是家里有老人孩子的&#xff0c;为了得到更好的视觉效果&#xff0c;使得消费者对于大屏的需求也在增加。酷开系统…

动脉自旋标记(ASL):临床应用及解读

导读 动脉自旋标记(Arterial spin labeling&#xff0c;ASL)是一种磁共振灌注成像技术&#xff0c;可以在不使用静脉钆造影剂的情况下量化脑血流量(CBF)。了解ASL的技术基础和灌注的生理变化对于识别正常变异和伪影很重要。灌注的病理变化见于多种疾病&#xff0c;包括急慢性缺…

【漏洞复现】云时空ERP Public接口处RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Altman专访自曝全新GPT-5细节:性能跃升超想象,算力足可达AGI!

&#x1f600;前言 在人工智能领域&#xff0c;OpenAI的最新一代模型GPT-5备受期待。其性能提升被认为将创造历史&#xff0c;并有潜力成为推动文明发展的核心动力。Altman作为OpenAI的领导人之一&#xff0c;在一系列访谈中透露了关于GPT-5和人工智能未来的深刻见解&#xff0…

低代码无法取代程序员,但为什么很多程序员却反感低代码?

引言 在当今快节奏的软件开发领域&#xff0c;低代码开发平台正日益受到关注并广泛应用。低代码开发通过可视化建模和自动化工具&#xff0c;使得非专业开发者和业务人员能够更快速地创建应用程序&#xff0c;从而大大加快了软件交付的速度。这种新兴的开发方式已经在许多行业…

Linux下QT界面小程序开发

背景&#xff1a;需要在linux不同环境下可以测试我们的读卡器设备 搭建本地linux开发环境&#xff08;本来想VS里开发然后通过SSH的方式在linux下编译&#xff0c;但是工具链一直没搞起来&#xff0c;所以我是在ubuntu里安装的QT Creator工具直接开发的&#xff09;&#xff1b…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加&#xff0c;需要处理的信息量也在增加。每年毕业&#xff0c;将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

FMEA助力新能源汽车行业腾飞:安全、效率双提升

随着新能源汽车市场的迅猛发展&#xff0c;各大车企纷纷加大研发力度&#xff0c;力求在激烈的市场竞争中脱颖而出。其中&#xff0c;FMEA&#xff08;故障模式与影响分析&#xff09;作为一种先进的质量管理工具&#xff0c;正被越来越多地应用于新能源汽车的研发和生产过程中…

【Django框架学习笔记】超详细的Python后端开发Django框架学习笔记

十二&#xff0c;Django框架 可以以下链接获取Django框架学习笔记,md文档和pdf文档 Django框架超详细的学习笔记&#xff0c;点击我获取 12.1 命令行操作 # 创建django项目 django-admin startproject aini# 启动项目 cd /mysite python3 manage.py runserver## 创建应用 …

深度学习-2.8模型拟合概念和欠拟合模型、过拟合调整策略

模型拟合概念和欠拟合模型、过拟合调整策略 文章目录 模型拟合概念和欠拟合模型、过拟合调整策略一、模型拟合度概念介绍1.测试集的“不可知悖论”2.模型拟合度概念与实验 二、过拟合、欠拟合问题解决方案1. 欠拟合解决方案2.过拟合解决方案 三、神经网络结果选择策略1. 参数和…

mybatis plus 修改sql

原始需求 在SQL语句前面加上一个request-id 问题描述 今天收到业务同学反馈&#xff0c;说接入某个SDK后&#xff0c;request-id本地debug发现sql已经修改了&#xff0c;但打印的sql中却没有request-id信息 看了下代码&#xff0c;发现用户的代码其实就是下方 方案一代码&am…