Leetcode-每日一题【138.复制带随机指针的链表】

news2024/11/24 19:55:21

题目

给你一个长度为 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]]


示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]


示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。

解题思路

前置知识

Map

Map集合存储元素是成对出现的,Map集合的键是唯一的,每个键最多只能映射到一个值。 不同键映射的值是可重复的。

注意:Map集合的数据结构是针对键有效,跟值无关。而Collection集合的数据结构是针对元素有效。

Map集合的功能概述
1: 添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null;
如果键不是第一次存储,就用值把以前的值替换掉,返回以前的值。
2: 删除功能
void clear():移除所有的键值对元素。
V remove(Object key):根据键删除键值对元素,并把值返回。
3: 判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
4: 获取功能
Set keySet():获取集合中所有键的集合
V get(Object key):根据键获取值
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
Collection values():获取集合中所有值的集合
5: 长度功能
int size():返回集合中的键值对的总数

1.题目要求我们做深拷贝,也就是返回复制后的链表,但是链表中存在一个random指针指向随意的节点,所以我们并不能按顺序去复制链表,因为random指针可能会指向我们还未复制的节点,这个时候我们就要采用hashMap来辅助我们解决这个问题

2.首先我们创建一个hashMap来存放(原节点,新节点),然后我们利用for循环每次循环时创建一个新节点,让它的值等于原节点,然后将他俩一起放入hashMap中

3.我们再次使用for循环对哈市Map进行遍历,令新节点的next值等于原节点的next值( nodeMap.get(x).next = nodeMap.get(x.next)),以及令新节点的random值等于新节点的random值(nodeMap.get(x).random = nodeMap.get(x.random)),最后我们返回新链表的头节点即可( return nodeMap.get(head))

代码实现

class Solution {
    public Node copyRandomList(Node head) {
        //边界
        if (head == null){
            return null;
        }
        //遍历原链表,构造新链表的节点,存储在Map中
        //Map<原链表节点,新链表节点>
        //原1 => 新1
        Map<Node,Node> nodeMap = new HashMap<>();
        for (Node x = head ; x != null; x = x.next){
            //构造新链表的节点
            Node node = new Node(x.val);
            nodeMap.put(x,node);
        }
        //对新链表进行链接操作
        //原1.next和新1.next一一对应
        //原1.random和新1.random一一对应
        //原1.next = 原3 => 新1.next = 新3(这个地址就可以根据原3来取得)
        for (Node x = head; x != null; x = x.next){
            //新链表的random和next和原链表一一对应
            //对于Map来说,key都是原链表的节点
            //原1.next = 原3
            nodeMap.get(x).next = nodeMap.get(x.next);
            //原1.random = 原5
            nodeMap.get(x).random = nodeMap.get(x.random);
        }
        //返回新链表的头节点,就是原链表的head的映射
        return nodeMap.get(head);
    }
}

测试结果

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

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

相关文章

手捏Java知识点

今天开始面向对象了 面向对象基础 类&#xff1a;由属性和行为组成属性&#xff1a;在类中通过成员变量来体现行为&#xff1a;在类中通过成员方法来体现public class 类名{//成员变量变量1的数据类型 变量1;变量2的数据类型 变量2;...//成员方法方法1;方法2;...}有几个重要的概…

百度iOS端长连接组件建设及应用实践

作者 | 百度消息中台团队 导读 在过去的十年里&#xff0c;移动端技术飞速发展&#xff0c;移动应用逐渐成为主要的便捷访问和使用互联网的方式&#xff0c;承接了越来越多的业务和功能&#xff0c;这也意味着对移动端和服务器之间的通信效率和稳定性提出了更高的要求。为了实现…

ellisys 过滤设备

1、通过关键字过滤 输入蓝牙名称关键字&#xff0c;比如下面输入的是BNCM Transmitter "*BNCM*" || Receiver "*BNCM*" 之后&#xff0c;所有与这个设备相关的信号都会抓取过滤出来 2、通过地址过滤 之后&#xff0c;所有与这个设备相关的信号都会抓取过…

港联证券-深夜,大利好!人民币暴拉超500点,全球股市大反攻

全球商场一夜狂欢。 美国通胀大降温&#xff0c;全球危险资产全线大涨。北京时间7月12日晚间&#xff0c;美国劳工统计局发布数据&#xff0c;美国6月CPI同比涨幅回落至3%&#xff0c;低于预期3.1%&#xff0c;接连第12个月下降&#xff0c;且为2021年3月以来最低。数据发布后&…

02 |「Android Studio 新建项目」

前言 新手入门安卓开发 文章目录 前言一、步骤一、步骤 New Project选择 Empty Activity1)Name:项目的名字; 2)Package name:项目的包名(项目的唯一标识); 3)Save location:项目的保存路径; 4)Language:

QT实现按钮开关Form窗体的效果

实现效果叙述如下&#xff1a; MainWindow中的按钮实现Form窗体的开关&#xff0c;Form窗体的关闭按钮禁用掉&#xff0c;只允许使用窗体按钮进行&#xff0c;且关闭MainWindow按钮时Form窗体随之关闭。 注意&#xff1a; 要想实现关闭MainWindow按钮时Form窗体随之关闭&#x…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

Docker部署前后端分离项目

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 项目部署 ✨特色专栏&…

K8s生产环境常见问题处理、答疑(连载、不定期更新)

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

LibreOffice 在win11(高版本win10)无响应的解决方案

问题描述 某次windows升级了以后&#xff0c;LibreOffice无法启动无响应、无报错 解决 安全模式启动 然后禁用显卡加速 然后&#xff1a;应用更改并重新启动 即可以正常模式启动LibreOffice

ARP协议(地址分析协议)

系列文章目录 数通王国历险记&#xff08;4&#xff09; 目录 前言 一&#xff0c;什么是地址解析协议&#xff08;ARP&#xff09; 二&#xff0c;封装和解封装 三&#xff0c;为什么需要地址解析协议&#xff08;ARP&#xff09; 四&#xff0c;ARP的验证实验 4.1&#x…

MySQL 学习笔记 4:视图

MySQL 学习笔记 4&#xff1a;视图 图源&#xff1a;ubiq.co 简单的说&#xff0c;视图就是“固化的SQL查询”。 这里看一个简单示例&#xff0c;我们有一个表&#xff0c;保存学生信息&#xff1a; mysql> select * from student limit 10; ---------------------------…

利用电价运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

外观模式:简化复杂系统的访问接口

外观模式是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问复杂系统中的一组接口。本文将深入探讨外观模式的原理、结构和使用方法&#xff0c;并通过详细的 Java 示例代码来说明。 1. 外观模式的定义 外观模式是一种通过提供一个简化的接口&…

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

springboot项目报错如下&#xff1a; 这个错误是由于在你的Java代码中使用了Logback日志库&#xff0c;但是同时又存在与Logback竞争的其他日志库&#xff08;例如slf4j-simple&#xff09;导致的冲突。 要解决这个问题&#xff0c;你可以尝试以下几个步骤&#xff1a; 1. 检…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网&#xff1f;网关地址是谁定的&#xff0c;是配置路由的人随意定的吗&#xff1f;&#xff08;配置人员定的&#xff09;如何正确设置网关地址&#xff08;路…

WPF 如何引入图标文件

文章目录 前言&#xff1a;WPF 引入图标什么是ttf字体阿里云矢量库下载WPF引用为什么文件路径是#iconfont而不是iconfont。前面为什么要带个#号&#xff1f; 前言&#xff1a; 我最近在研究WPF&#xff0c;吃饭嘛&#xff0c;桌面端实在是不想用Winform&#xff0c;太丑了。WP…

WebDAV之π-Disk派盘+Notability

Notability 支持WebDAV方式连接π-Disk派盘。 Notability是一款功能强大的数字笔记应用,适用于iOS和macOS。它提供了优秀的手写体验,支持手写、录音和多种标记。用户可以记录想法、思路、绘图和草图,进行注释和标记,实现高效的学习和创作。同时,Notability具有文本输入、…

16 Java获取随机数

使用new Random创建一个随机数对象&#xff0c;然后调用里面的nextInt方法&#xff0c;方法中传入一个数字n&#xff0c;则随机数的范围为[0,n&#xff09;。代码如下&#xff1a; package demo;import java.util.Random;public class Demo10 {public static void main(String…

xilinx zc706 以太网性能测试(iperf)

一&#xff1a;概述 以太网流量测试是一种评估网络性能和容量的测试方法。它通过模拟实际网络环境中的数据流量&#xff0c;以确定网络在高负载情况下的表现。 在以太网流量测试中&#xff0c;可以使用各种工具和技术来生成和控制数据流量。这些工具可以模拟不同类型的流量&a…