随机链表的复制(Java详解)

news2024/11/16 13:55:43

一、题目描述

给你一个长度为 的链表,每个节点包含一个额外增加的随机指针 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 作为传入参数。

示例:

二、题解

题目分析:

给定的链表节点包含三个部分:

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

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

(1)val:当前节点存储的值

(2)next:指向下一节点

(3)random:随机指针 可以指向链表中的任何节点或空节点

复制这个随机链表,即每个新节点的值与其对应的原节点的值相同。新节点的 next 指针和 random 指针也都指向对应的新节点

思路分析:

若复制普通链表,我们只需遍历原链表,在遍历过程中创建新节点,再通过前驱节点prev指向当前新节点,即可实现普通链表的复制。而本题中新增了 random,由于 random 可以指向链表中任意节点或空节点,意味着我们不仅要实现 前驱节点对当前节点的指向,也要实现 前驱节点对随机节点的指向

我们可以利用哈希表,通过构建原链表节点与新链表节点的键值对映射关系来解决该题

具体实现:

(1)根据原链表节点的值创建新链表,并把原链表的节点和创建的新链表节点放入哈希表 map

(2)遍历原链表,根据原链表节点cur的next、random找到新链表节点node的next、random指向,并确定新链表的next、random

通过原链表节点找到新链表节点:map.get(cur),新链表节点的next:map.get(cur).next

通过原链表节点的next找到新链表节点的next:map.get(cur.next)

确定新链表的next:map.get(cur).next = map.get(cur.next)

通过原链表节点找到新链表节点:map.get(cur),新链表节点的random:map.get(cur).random

通过原链表节点的next找到新链表节点的random:map.get(cur.random)

确定新链表的random:map.get(cur).random = map.get(cur.random)

(3)返回新链表的头节点

通过原链表的头节点,找到新链表的头节点,并返回

代码实现:

class Solution {
    public Node copyRandomList(Node head) {
        //根据原链表创建新链表
        Node cur = head;
        Map<Node,Node> map = new HashMap<>();
        //遍历原链表,创建新链表,并将其放入map中
        while(cur != null){
            Node node = new Node(cur.val);
            map.put(cur,node);
            cur = cur.next;
        }
        //根据原链表节点的next、random修改新链表节点的next、random
        cur = head;
        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);
    }
}

题目来自:

138. 随机链表的复制 - 力扣(LeetCode)

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

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

相关文章

英语——分享篇——常用人物身份

常用人物身份 家庭成员类 father 父亲 mother 母亲 grandmother&#xff08;外&#xff09;祖母 grandfather&#xff08;外&#xff09;祖父 son 儿子 daughter 女儿 uncle 叔叔&#xff0c;舅舅 aunt 婶母&#xff0c;舅母 brother 兄弟 sister 姐妹 nephew 侄子 niece…

Centos7下生成https自签名证书

1、安装openssl yum install openssl2、生成带密码的私有秘钥文件 openssl genrsa -des3 -out server.key 2048使用带密码的私有秘钥文件时需要输入密码&#xff0c;这里直接输入&#xff1a;123456 3、生成不带密码的私有秘钥文件 openssl rsa -in server.key -out serve…

考虑时空相关性的风电功率预测误差MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 风电功率预测置信区间误差分析拟合 1.风电功率预测误差--时空相关性 展示第一一个时间段的风电功率预测与实际风电功率值的比较。填充区域表示预测的不确定性&#xff0c;显示了95%置信区间内预测可能的范围…

vulnhub momentum 靶机复盘

环境配置 到学校了 原来的桥接配置要改 这里记录几个点备忘 1.virtualbox 桥接 未指定 重新安装驱动VBoxNetLwf.inf 2.配置完靶机启动失败 手动安装VBoxNetLwf.inf 不要用virtualbox自带的netlwfinstall 3.配置完nmap扫不到 rw init/bin/bash 进去看看网卡配置 信息收集…

【Java系列】HashMap

HashMap 介绍HashMap 类提供了很多有用的方法添加键值对(key-value)创建一个字符串&#xff08;String&#xff09;类型的 key 和字符&#xff08;String&#xff09;类型的 value&#xff1a;访问元素删除元素删除所有键值对(key-value)可以使用 clear 方法&#xff1a;计算大…

基于SSM的养老院管理系统

基于SSM的养老院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 养老院管理系统是一个基于SSM&#xff08;Spring、Spring MVC、MyBatis&…

基于SSM的航空订票系统

基于SSM的航空订票系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 管理员界面 摘要 基于SSM的航空订票系统是一款面向旅客、航空公司和旅…

FreeRTOS_信号量之二值信号量

目录 1. 信号量简介 2. 二值信号量 2.1 二值信号量简介 2.1.1 二值信号量无效 2.1.2 中断释放信号量 2.1.3 任务获取信号量成功 2.1.4 任务再次进入阻塞态 2.2 创建二值信号量 2.2.1 vSemaphoreCreateBinary() 2.2.2 xSemaphoreCreateBinary() 2.2.3 xSemaphoreCrea…

初学编程需要什么基础,零基础学编程系统化编程课程之编程工具箱文件名称操作构件属性

初学编程需要什么基础&#xff0c;零基础学编程系统化编程课程之编程工具箱文件名称操作构件属性 上图为 该编程工具构件的基本属性和方法 编程系统化课程总目录及明细&#xff0c;零基础学中文编程视频教程&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/…

2023年阿里云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;阿里云也正式开启了双11大促&#xff0c;推出了“金秋云创季”活动&#xff0c;那么&#xff0c;2023年阿里云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、阿里云双11活动时间 1、2023年10月27日-2023年10月31日&#xff…

基于蝠鲼觅食算法的无人机航迹规划-附代码

基于蝠鲼觅食算法的无人机航迹规划 文章目录 基于蝠鲼觅食算法的无人机航迹规划1.蝠鲼觅食搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蝠鲼觅食算法来优化无人机航迹规划。 …

前端HTML

文章目录 一、什么是前端前端后端 前端三剑客1.什么是HTML2.编写前端的步骤1.编写服务端2.浏览器充当客户端访问服务端​ 3.浏览器无法正常展示服务端内容(因为服务端的数据没有遵循标准)4.HTTP协议>>>:最主要的内容就是规定了浏览器与服务端之间数据交互的格式 3. 前…

“第五十五天”

定点数&#xff1a; 原码的乘法&#xff1a; 乘法的符号位是单独处理的&#xff08;通过对被乘数和乘数的符号位进行异或实现&#xff09;&#xff0c;数值位去绝对值进行运算。这里的乘法实际上是通过多次加法实现的。 这里被乘数是放在x寄存器&#xff0c;乘数放在MQ寄存器…

数据结构线性表——顺序表

前言&#xff1a;小伙伴们好久不见&#xff0c;从这篇文章开始&#xff0c;我们就要正式进入数据结构的学习啦。 学习的难度也将逐步上升&#xff0c;希望小伙伴们能够和博主一起坚持&#xff0c;一起加油&#xff01;&#xff01;&#xff01; 目录 一.什么是线性表 二.什么…

便利店超市怎么做一个实用的微信小程序?

近年来&#xff0c;微信小程序商城越来越受到商家的青睐&#xff0c;因为它不仅提供了便捷的在线购物体验&#xff0c;而且不需要安装额外的应用。对于零编程经验的初学者&#xff0c;制作一个小程序商城可能会感到有些困难&#xff0c;但不用担心&#xff0c;本文将引导你一步…

Netty复习:(2)IdleStateHandler的用法

一、handler定义&#xff1a; package handler;import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter;public class MyChatServerHandler3 extends ChannelInboundHandlerAdapter {Overridepublic void userEventTriggered(…

【实用教程】MySQL内置函数

1 背景 在MySQL查询等操作过程中&#xff0c;我们需要根据实际情况&#xff0c;使用其提供的内置函数。今天我们就来一起来学习下这些函数&#xff0c;在之后的使用过程中更加得心应手。 2 MySQL函数 2.1 字符串函数 常用的函数如下&#xff1a; concat(s1,s2,…sn)字符串…

Ansible的安装和部署

目录 1.Ansible的安装 2.构建Ansible清单 直接书写受管主机名或ip 设定受管主机的组[组名称] 主机规格的范围化操作 指定其他清单文件 ansible命令指定清单的正则表达式 3.Ansible配置文件参数详解 配置文件的分类与优先级 常用配置参数 4.构建用户级Ansible操作环…

女神联盟2攻略,女神联盟2-GM红将全免

女神联盟2攻略&#xff1a;前期过渡阵容建议&#xff1a; 在女神联盟2-GM红将全免的初期玩法中&#xff0c;资源的获取是有限的&#xff0c;因此玩家需要合理运用搭配&#xff0c;避免浪费。同时在有限的资源中与敌人竞争资源需要进行头脑对决。首先&#xff0c;游戏中的硬通货…

Linux学习第27天:Platform设备驱动开发: 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 专注与分散是我在题目中着重说明的一个内容。这是今天我们要学习分离与分层概念的延伸。专注是说我们要专注某层驱动的开发&#xff0c;而对于其他层则是芯片厂商…