HOT32-复制带随机指针的链表

news2025/1/10 3:09:19

    leetcode原题链接:复制带随机指针的链表

题目描述

       给你一个长度为 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保存旧链表的每一个节点到新链表的每一个节点的映射。

C++代码

#include <iostream>
#include <memory> // std::shared_ptr
#include <map>
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (!head) {
            return head;
        }
        Node *p = head; //旧链表
        std::shared_ptr<Node> dummy_node(new Node(0));
        Node* p1 = dummy_node.get();//p1始终指向最后一个已经copy过的节点
        std::map<Node*, Node*> mp;
        // 先生成旧链表,更新value和next
        while (p) {
            Node* new_node = new Node(p->val);
            mp[p] = new_node;//生成旧链表节点到新链表节点的映射
            p1->next = new_node; //p1始终指向新链表最后一个已经copy过的节点
            //更新指针
            p = p->next;
            p1 = p1->next;
           
        }
        // 更新新链表每个节点的random指针
        p = head;
        p1 = dummy_node->next;
        while(p && p1) {
            Node* p_rand_node = p->random;
            if (p_rand_node && mp.count(p_rand_node)) {
                p1->random = mp[p_rand_node];
            }
            p = p->next;
            p1 = p1->next;
        }
        return dummy_node->next;
    }
};

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

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

相关文章

企业如何判断是否选择CRM系统?

如今&#xff0c;以客户为中心的观点已经被广泛认可&#xff0c;想要建立以客户为中心的战略离不开CRM客户关系管理系统的应用&#xff0c;企业什么时候需要CRM&#xff1f;附CRM软件的选购指南。当企业出现这4点问题的时候证明是时候部署CRM了。 1.客户资料散乱 通常每个业务…

【结构型设计模式】桥接模式

一、写在前面 桥接模式&#xff08;Bridge&#xff09;&#xff1a;桥接模式是一种结构型设计模式&#xff0c;其目的是将抽象部分和实现部分分离&#xff0c;允许它们可以独立地变化。该模式通过创建一个桥接类&#xff0c;连接抽象和实现&#xff0c;使得它们可以独立地进行…

【前端|CSS系列第3篇】CSS盒模型、浮动及定位

在前端开发中&#xff0c;CSS是一项重要的技术&#xff0c;用于控制网页的样式和布局。在本系列的第三篇文章中&#xff0c;我们将学习CSS的盒模型、浮动以及定位&#xff0c;这些概念和技术在页面布局中起着至关重要的作用。通过本文的学习&#xff0c;希望能够帮助大家更好地…

阿里云远程仓库环境安装

记录一些基本的命令&#xff1a; 一、apt-get&#xff0c;是一条linux命令&#xff0c;适用于deb包管理式的操作系统&#xff08;例如Ubuntu系统&#xff09;&#xff0c;主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。 // 常用命令&#xff1a; ap…

沐风老师3DMAX虚线对象插件Dashed使用方法详解

3DMAX虚线对象插件Dashed教程 Dashed虚线对象插件&#xff0c;用于沿拾取路径创建虚线&#xff08;或实线&#xff09;几何体对象 【主要特点】 -更多实用参数可以调节。 -沿着样条曲线测量距离值&#xff08;如&#xff1a;笔划长度、间距、分段长度等&#xff09;&#xff…

MySql的MVCC_存储引擎_历史_开发模式

概览 一. 多版本并发控制(MVCC)1.概述2.InnoDB的MVCC 二.MySql的存储引擎 一. 多版本并发控制(MVCC) 1.概述 可以认为MVCC是行级锁的一个变种,其在很多情况下避免了加锁操作&#xff0c;因此开销更低。 不同存储引擎的MVCC实现是不同的&#xff0c;但大部分实现了非阻塞的读…

Nginx(5)nginx的负载均衡

负载均衡 负载均衡的原理及处理流程负载均衡的作用 负载均衡常用的处理方式Nginx七层负载均衡Nginx七层负载均衡的指令Nginx七层负载均衡的实现流程 负载均衡状态负载均衡策略负载均衡案例案例一&#xff1a;对所有请求实现一般轮询规则的负载均衡案例二&#xff1a;对所有请求…

红色通信史(二):半部电台起家

上一期&#xff0c;我给大家介绍了“四一二”反革命政变后&#xff0c;我党在上海开通了第一部秘密电台的过程。 秘密电台的开通&#xff0c;标志着我党通信事业正式起步。然而&#xff0c;没过多久&#xff0c;顾顺章叛变&#xff0c;给上海党组织带来了极大的破坏。于是&…

事务

事务回顾MySQL事务Spring事务实现编程式事务实现&#xff1a;声明式事务 Transactional 注解作用范围及名称&#xff08;value/transactionManager&#xff09;隔离级别&#xff1a;isolation超时时间&#xff1a;timeout修改只读事务指定异常异常捕获情况 事务失效场景Transac…

高等数学II-知识点(1)——原函数的概念、不定积分、求原函数的两种常用方法 (凑微分法、第二换元法)、分部积分法、有理函数原函数求法、典型三角函数原函数求法

目录 原函数的概念 不定积分 定义 不定积分的基本积分公式 不定积分的运算法则 求原函数的两种常用方法 第一换元法&#xff08;凑微分法&#xff09; 第二换元法 分部积分法 有理函数原函数求法 典型三角函数原函数求法 原函数的概念 设在区间上有定义&#xff0c…

Python3 实例(一) | 菜鸟教程(十九)

目录 一、Python Hello World 实例 二、 Python 数字求和 &#xff08;一&#xff09;以下实例为通过用户输入两个数字&#xff0c;并计算两个数字之和&#xff1a; &#xff08;二&#xff09;两数字运算&#xff0c;求和我们使用了加号 ()运算符&#xff0c;除此外&#…

GB51309实施后对于消防应急照明和疏散指示系统在城市隧道应用中的影响

安科瑞 崔丽洁 【摘要】&#xff1a;应急照明和疏散指示系统被广泛运用于城市隧道、楼宇建筑、地下管廊等各个方面。当隧道这类特殊建筑内出现火灾或事故时&#xff0c;可靠的应急照明和疏散指示系统对于人员的安全逃生有着重要的作用。随着GB51309-2018《消防应急照明和疏散指…

java从入门到起飞(三)——三大结构(顺序结构、分支结构、循环结构)

目录 前提顺序结构分支结构if选择语句switch语句 循环结构for循环语句格式while循环语句格式do…while循环语句三种循环的区别三种循环的区别&#xff1a;for和while的区别&#xff1a;死循环格式&#xff1a; 前提 三大结构也成为流程控制语句&#xff0c;分为三大类&#xff…

flask+uwsgi+docker+nginx 云服务器部署测试平台

flaskuwsgidockernginx 云服务器部署测试平台 开发环境 本次主要是在腾讯云上进行部署&#xff0c;系统是CentOS 7.9 64位&#xff0c;主要使用的软件如下&#xff1a; Python 3.9.5 Pycharm Flask1.0.2 Mysql 5.7 nginx uwsgi 一 安装Nginx 1.更新yum 源 sudo rpm -ivh …

基于Java+Swing+Mysql图书信息管理系统

基于JavaSwingMysql图书信息管理系统 一、系统介绍二、功能展示1.主页2.新增图书信息3.删除图书信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看图书列表、新增图书信息、删除图书信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

TCP的三次握手,四次挥手

1.TCP协议介绍 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。由IETF的RFC 793 [1] 定义…

云之道知识付费v2 3.1.1独立版小程序系统源码

云之道知识付费v2 3.1.1独立版小程序系统源码 很不错的一款知识丰富小程序&#xff0c;感兴趣的可以自己下载搭建尝试一下。

Java官方笔记13集合

Storing Data The Collections Framework is the most widely used API of the JDK. 集合不是数据类型&#xff0c;它是JDK的API&#xff0c;可以用来存储数据等&#xff0c;相当于数据结构。 the Collections Framework is a set of interfaces that models different way of …

chatgpt赋能python:用Python做中文词云

用Python做中文词云 介绍 中文词云是一种常见的数据可视化方式&#xff0c;通过将文本中出现频率较高的关键词以图形的形式展现出来&#xff0c;让人一眼就能了解文本内容的主题和关键词。在搜索引擎优化&#xff08;SEO&#xff09;方面&#xff0c;中文词云也常被用来帮助分…

【python】使用Antlr4实现识别sql中的表或视图名

前言 先上成果预览图吧 作为一个数据库sql开发者,肯定有很多人和我一样,想要有一个工具,能传入任意sql,解析出sql中的所有表。 我之前有一篇文章【AIO】将任意查询sql转换成带远程数据库DBLINK的sql 中就提到了,使用纯文本硬解析会存在很多不确定因素,比如oracle新版本…