力扣hot100:138. 随机链表的复制(技巧,数据结构)

LeetCode:138. 随机链表的复制
在这里插入图片描述
这是一个经典的数据结构题,当做数据结构来学习。

1、哈希映射

需要注意的是,指针也能够当做unordered_map的键值,指针实际上是一个地址值,在unordered_map中,使用指针的实际内存地址值计算哈希函数,通过指针值来判断两个键值是否相等。

在第一次遇到这个问题时,最容易想到的方法自然是使用哈希表直接构造一模一样的。
遇到任何一个新结点直接构造,并用哈希表存储映射,然后依次遍历连接,每个遍历到的结点仅有可能被构造过,但不可能更新过nextrandom

使用哈希表:

  • 时间复杂度: O ( n ) O(n) O(n),其中n是链表的长度
    • 依次遍历,每个节点被遍历一次,每个节点被构造一次,每个节点被插入到哈希表一次,每个节点本身以及其后继和随机指向都在哈希表中被查找一次,平均查找和插入的速度为 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( n ) O(n) O(n),哈希表的空间
    在这里插入图片描述
class Solution {
public:
    Node* copyRandomList(Node* head) {
        unordered_map<Node *,Node *> mp;
        for(Node * p = head; p != nullptr; p = p->next){
            Node * nw;
            if(mp.count(p) == 0) {nw = new Node(p->val);mp[p] = nw;}//不重复构造,每个遍历到的结点p都需要更新next 和 random
            else nw = mp[p];
            
            if(p->next){//是否有后继
                if(mp.count(p->next) == 0){//后继是否被构造过
                    Node * nw_nex =  new Node(p->next->val); //如果没有的话,则构造并建立映射,连接后继
                    mp[p->next] = nw_nex;
                    nw->next = nw_nex;
                }
                else nw->next = mp[p->next];//有被构造过直接连接后继
            }
            if(p->random){
                if(mp.count(p->random) == 0){
                    Node * nw_random =new Node(p->random->val);
                    mp[p->random] = nw_random;
                    nw->random = nw_random;
                }
                else nw->random = mp[p->random];
            }
        }
        return mp[head];
    }
};
  • 当然直接遍历一次构建所有哈希映射,然后再连接会更简单,可以减少判断是否被构造过的情况,因为先建立之后一定被构造。
    • 这种方法只需要遍历两遍链表,每个结点进行一次哈希插入,以及进行其的后继和其随机指针进行一次哈希查找即可。

2、迭代 + 节点拆分(技巧性)

在这里插入图片描述第一遍遍历:拷贝结点,并将拷贝出的结点作为原结点的后继,拷贝后的结点的后继指向原结点的原始后继;
第二遍遍历:更新random
第三遍遍历:节点拆分,将拷贝出的结点和原始节点拆出来变成俩链。

你会发现,将拷贝结点作为原结点的后继,拷贝后的结点的后继指向原结点的原始后继并不影响原链表的遍历,因此这个方法是可行的。

这个方法拷贝的思想相当于先拷贝后继,将其放入到原始节点的后继。这并不会导致无法实现原链表的任何功能。然后再更新拷贝后的结点的信息,这时更新时所有原始链表的结点都已经被拷贝过一次,所有信息都可以直接使用。而不需要像方法一一样,顺序遍历更新,并不一定能保证random已经被创建出来,因此只能用哈希表存储

  • 时间复杂度: O ( n ) O(n) O(n),n是链表长度
    • 遍历一遍链表,拆分一次链表
  • 空间复杂度: O ( 1 ) O(1) O(1)
    在这里插入图片描述
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head) return head;
        //拷贝结点,更新后继
        Node * cur = head;
        while(cur){
			Node * nextNode = cur->next;
			cur->next = new Node(cur->val);
			cur->next->next = nextNode;
			cur = nextNode;
		}
		//更新random
		cur = head;
		while(cur){
			if(cur->random) cur->next->random = cur->random->next;//random可能为空
			cur = cur->next->next;
		}
		//节点拆分
		cur = head;
		Node * p = new Node(0);
		Node * result = p;
		while(cur){
			p->next = cur->next;
            p = p->next;
			cur->next = cur->next->next;
			cur = cur->next;
		}
		return result->next;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++--DAY3

思维导图 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class …

小孩天赋是怎样炼成的 懂孩子比爱孩子更重要 详细天赋评估列表 观察非常细致 培养领导能力的方法

懂孩子比爱孩子更重要 “懂孩子比爱孩子更重要&#xff0c;懂才更准确的去爱” 这句话说得很有道理。理解孩子的内心世界、需求和独特个性&#xff0c;比单纯地给予爱更加重要。以下是一些解释&#xff1a; 理解孩子的需要&#xff1a;懂孩子意味着理解他们的需求、恐惧、欢乐…

SVN安装详细教程

&#x1f4d6;SVN安装详细教程 ✅1. 下载✅2. 安装✅3. 使用 ✅1. 下载 官方地址&#xff1a;https://tortoisesvn.net/downloads.html 123云盘地址&#xff1a;https://www.123pan.com/s/4brbVv-rsoWA.html ✅2. 安装 双击TortoiseSVN-1.14.6.29673-x64-svn-1.14.3.msi安装…

【微信小程序】模板语法

数据绑定 对应页面的 js 文件中 定义数据到 data 中&#xff1a; 在页面中使用 {{}} 语法直接使用&#xff1a; 事件绑定 事件触发 常用事件&#xff1a; 事件对象的属性列表&#xff08;事件回调触发&#xff0c;会收到一个事件对象 event&#xff0c;它的详细属性如下&…

智慧医疗新纪元:可视化医保管理引领未来

在数字化浪潮席卷全球的今天&#xff0c;我们的生活正在经历前所未有的变革。其中&#xff0c;智慧医保可视化管理系统就像一股清新的风&#xff0c;为医疗保障领域带来了全新的活力与可能。 想象一下&#xff0c;在繁忙的医院里&#xff0c;患者和家属不再需要为了查询医保信息…

GPT-4 Turbo 和 GPT-4 的区别

引言 人工智能&#xff08;AI&#xff09;领域的发展日新月异&#xff0c;OpenAI 的 GPT 系列模型一直是这一领域的佼佼者。GPT-4 和 GPT-4 Turbo 是目前市场上最先进的语言模型之一。本文将详细探讨 GPT-4 和 GPT-4 Turbo 之间的区别&#xff0c;以帮助用户更好地理解和选择适…

NSIS 安装包默认支持的参数

NSIS 安装包默认支持的参数 NSIS 制作的安装包默认支持 /NCRC、/S、/D 三个参数&#xff0c;详见下文 3.2 Installer Usage&#xff08;来自 Command Line Usage&#xff09;。 以上三个参数对应的功能分别为禁止 CRC 校验、静默安装、设置安装路径&#xff0c;这三个功能不需…

数据资产入表-数据治理-标签设计标准

前情提要&#xff1a;数据价值管理是指通过一系列管理策略和技术手段&#xff0c;帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程&#xff0c;即数据治理和价值变现。上一讲介绍了数据清洗标准设计的基本逻辑和思路。 上一讲介绍了其他的通用标…

PyTorch 相关知识介绍

一、PyTorch和TensorFlow 1、PyTorch PyTorch是由Facebook开发的开源深度学习框架&#xff0c;它在动态图和易用性方面表现出色。它以Python为基础&#xff0c;并提供了丰富的工具和接口&#xff0c;使得构建和训练神经网络变得简单快捷。 发展历史和背景 PyTorch 是由 Fac…

几何裁剪技术在AI去衣应用中的革新作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域的应用也日益广泛。特别是在AI去衣技术中&#xff0c;几何裁剪技术扮演着至关重要的角色。本文将深入探讨几何裁剪技术在AI去衣中的应用及其带来的影响。 一、几何裁剪技术概述 几何裁剪技术是一种基…

【python】python租房数据分析可视化(源码+数据+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

completefuture造成的rpc重试事故

前言 最近经历了一个由于 completefuture 的使用&#xff0c;导致RPC重试机制触发而引起的重复写入异常的生产bug。复盘下来&#xff0c;并非是错误的使用了completefuture&#xff0c;而是一些开发时很难意识到的坑。 背景 用户反馈通过应用A使用ota批量升级设备时存在概率…

北航数据结构与程序设计第四次作业选填题复习

首先都是线性的&#xff0c;线性包括顺序和链式&#xff0c;栈和队都可以用两种方式实现。栈只能存于栈顶取于栈顶&#xff0c;队列先进先出&#xff0c;因此存取点是固定的。 函数栈帧创建原理 画图即可。 A.显然不行&#xff0c;5如果第一个出来说明5是最后一个进的&#xf…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

解锁下载EasyRecovery2024电脑版软件 3步破解下载秘籍!

在数字时代&#xff0c;数据已成为我们生活中不可或缺的一部分。无论是工作中的重要文件&#xff0c;还是珍贵的家庭照片和视频&#xff0c;数据都承载着我们的回忆和努力。然而&#xff0c;数据的丢失也是我们常常遇到的问题。硬盘损坏、误删除、病毒攻击等都可能导致数据丢失…

echarts 仪表盘根据点击的刻度重新设置值

1 更具点击获取的坐标 event.offsetY , event.offsetX 2 通过中心点坐标差,获取角的度数,然后取180度的占比,最后✖️总值刻度值. 3 然后在赋值给data 例子 : 角的度数是30度 30/180*30 5 则刻度值指向5 角度度数怎么求? (Math.atan2(y - event.offsetY, x - event.offsetX) …

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-50关】

【Less-42】 使用 or 11 -- aaa 密码&#xff0c;登陆成功。 找到注入点&#xff1a;密码输入框。 解题步骤&#xff1a; # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

Siemens-NXUG二次开发-创建倒斜角特征、边倒圆角特征、设置对象颜色、获取面信息[Python UF][20240605]

Siemens-NXUG二次开发-创建倒斜角特征、边倒圆角特征、设置对象颜色、获取面信息[Python UF][20240605] 1.python uf函数1.1 NXOpen.UF.Modeling.AskFaceData1.2 NXOpen.UF.Modeling.CreateChamfer1.3 NXOpen.UF.ModlFeatures.CreateBlend1.4 NXOpen.UF.Obj.SetColor 2.实体目标…

计算机组成原理-唐朔飞 概念总结(概论 总线 存储器部分)

计算机系统由“硬件”“软件”两大部分组成&#xff0c;软件通常存放在主存或辅存 软件分为系统软件和应用软件 1.1.2 计算机系统的层次结构 源程序&#xff1a;用户用高级语言编写的程序 目标程序&#xff1a;机器能识别的机器语言程序 实际机器&#xff1a;直接执行机器…

C++缺省参数函数重载

缺省参数 大家知道什么是备胎吗&#xff1f; C中函数的参数也可以配备胎。 3.1缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时&#xff0c;如果没有指定实参则采用该默认值&#xff0c;否则使用指定的实参。 void TestFunc(int a 0…