【leetcode】138.复制带随机指针的链表

news2024/11/25 18:47:24

《力扣》138.复制带随机指针的链表
给你一个长度为 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 作为传入参数。

解题思路

总结:题目叫我们深度拷贝链表,链表里包含一个随机生成的指针random,指向链表内其他结点,深度拷贝的过程中,新链表要还原随机生成的指针在原链表中指向的对应位置(新链表指向新链表对应的位置)

本题如果没有随即指针random会变得非常简单,难点在random的拷贝

(第一步)

  • 我们可以将新链表插入到原链表中,新的第一个结点放在原链表的第一个结点后,新的第二个结点放在原的第二个结点后….(以此类推)

插入前

在这里插入图片描述

插入后

在这里插入图片描述

(第二步)由上图中可以了解到

  • 原结点1的random指针指向原结点3,新结点1的random指针指向的是原结点3的next
  • 原结点3的random指针指向原结点2,新结点3的random指针指向的是原结点2的next

(第三步)

  • 将链表分开,并返回新的链表即可

在这里插入图片描述


代码实现⭐

优解

struct Node* BuyNode(int x)		//创建新结点,初始化变量。
{
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    if(temp==NULL)
    {
        perror("malloc:");
    }
    struct Node* NewNode = temp;
    NewNode->next = NULL;
    NewNode->val = x;
    NewNode->random = NULL;
    return NewNode;
}
struct Node* copyRandomList(struct Node* head) {		
    struct Node* cur = head;
    struct Node* rethead = NULL;
    struct Node* rettail = NULL;
    while(cur)		//将新链表插入到原链表中
    {
        struct Node* next = cur->next;
        cur->next = BuyNode(cur->val);
        cur->next->next = next;
        cur = next;
    }
    cur = head;
    while(cur)			//将random进行对应的赋值
    {
        if(cur->random==NULL)
        {
            cur->next->random=NULL;
        }
        else
        {
            cur->next->random = cur->random->next;
        }  
        cur = cur->next->next;
    }
    cur = head;
    while(cur)			//将链表分开
    {
        if(rettail==NULL)
        {
            rethead = rettail = cur->next;
        }
        else
        {
            rettail->next = cur->next;
            rettail = rettail->next;
        }
        cur = cur->next->next;
    }
    return rethead;
}

暴力破解

就是每次都从头遍历记录random是原链表的第几个,然后遍历相同位数在新链表上。

struct Node* BuyNode(int x)
{
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    if(temp==NULL)
    {
        perror("malloc:");
    }
    struct Node* NewNode = temp;
    NewNode->next = NULL;
    NewNode->val = x;
    NewNode->random = NULL;
    return NewNode;
}
struct Node* copyRandomList(struct Node* head) {
	struct Node* Newhead = NULL;
    struct Node* Newtail = NULL;
    struct Node* phead = head;
    while(phead)
    {
        if(Newtail==NULL)
        {
            Newtail = Newhead = BuyNode(phead->val);
        }
        else
        {
            Newtail->next = BuyNode(phead->val);
            Newtail = Newtail->next;
        }
        phead = phead->next;
    }
    phead = head;
    int count;
    struct Node* newhead = Newhead;
    while(phead)
    {
        count = 0;
        struct Node* temp = phead->random;
        if(temp==NULL)
        {
            newhead->random = NULL;
            newhead = newhead->next;
            phead = phead->next;
            continue;
        }
        struct Node* cur = head;
        while(cur)
        {
            if(temp!=cur)
            {
                cur = cur->next;
                count++;
            }
            else
            {
               break; 
            }
        }
        cur = Newhead;
        while(count--)
        {
            cur = cur->next;
        }
        newhead->random = cur;
        newhead = newhead->next;
        phead = phead->next;
    }
    return Newhead;
}

完结

创作不易,还请各位小伙伴多多点赞👍关注收藏⭐

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

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

相关文章

[羊城杯 2020]a_piece_of_java

首先jd-gui进行反编译 简单查看发现有用的类就两个一个是 MainContrller.class和InfoInvocationHandler.class public class MainController {GetMapping({"/index"})public String index(CookieValue(value "data", required false) String cookieDa…

【C++】类和对象(初阶认识)#上篇#

目录 对面向过程和面向对象的初步认识 类的引入 封装 和 类的访问限定符 所以祖师爷在类中还引入了访问权限 用类定义变量 类的理解和对象的实例化 sizeof 计算类对象的大小 类对象的成员函数在公共代码区 this 指针 对面向过程和面向对象的初步认识 什么,是…

分片集群-搭建

分片集群 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。 为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。 垂直扩展:增加更多的…

阿里云服务器地域和可用区怎么选择合适?

阿里云服务器地域和可用区怎么选择?地域是指云服务器所在物理数据中心的位置,地域选择就近选择,访客距离地域所在城市越近网络延迟越低,速度就越快;可用区是指同一个地域下,网络和电力相互独立的区域&#…

ROHM常见的电冰箱控制电路图,轻松了解冰箱工作原理

​冰箱是我们日常生活中使用频率非常高的电器,它可以将食物和饮料保存在低温下,以延长它们的保质期。冰箱的工作原理主要基于制冷循环和温度控制。 先看电路图: 1. 单门直冷式电冰箱重锤式控制电路 电路的基本组成:采用重锤式启…

win10安装pytorch全网最好用的教程[2023.5.7更新]

目录 0.关于pytorch a. 什么是 PyTorch ? b. 为何选择 PyTorch ? 1.安装pytorch 1.1确定关联性 1.2下载最新版本的pytorch 1.3.pytorch历史版本下载 1.4 避坑 1.4.1、猜测 1.4.2、验证 1.4.3、解决方案 1.5、检验 0.关于pytorch a. 什么是…

前端学习----webpack入门学习

webpack是前端项目工程化的具体解决方案 主要功能:它提供了友好的前端模块化开发支持,以及 代码压缩(将空格和注释全部消除,变成一行代码)、 处理浏览器端JavaScript的兼容性(只管写高级语法,自动向下兼容。例如ie8不支持let 语法…

【Shell】一天快速入门

1 Shell解析器 Linux提供的shell解析器有6种: /bin/sh /bin/bash /sbin/nologin /bin/csh /bin/dash /bin/tashsh是bash的软连接。 2 Shell脚本 2.1 hello.sh脚本 #!/bin/bash echo hello world!#! 告诉系统这个脚本需要什么解释器来执行; 脚本以#!…

NCNN----Monodepthv2单目深度估计 小米手机部署

题目要求:学习了解单目深度估计模型MonoDepthv2,基于NCNN推理框架部署到小米手机 MonoDepthv2 论文:Digging Into Self-Supervised Monocular Depth Estimation MonoDepthv2 源码:Monodepth2 GitHub 分析: 1&#xff0…

Illustrator如何进行任务自动化之实例演示?

文章目录 0.引言1.动作的录制2.对文件播放动作3.批处理 0.引言 因科研等多场景需要进行绘图处理,笔者对Illustrator进行了学习,本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结,本文对任务自动化进行…

Cadence技巧总结学习(DRC、Annotate)持续更新~

Cadence技巧总结学习持续更新~ 你还可以再哪里看到这篇文章:知乎 1. 画叉 对于芯片上不用的引脚信号画上号,如下: 按大写X就可以了,或是双脚引脚,在跳出的界面中,Is No Connect上✔。 2. 画线快捷键&#…

【关于C++中----智能指针】

文章目录 一、概念引入二、内存泄漏2.1 内存泄漏概念及其危害2.2 内存泄漏分类2.3 避免内存泄漏 三、智能指针的原理3.1 RAII3.2 像指针一样 四、三类智能指针4.1 auto_ptr4.2 unique_ptr4.3 shared_ptr 五、循环引用和weak_ptr 一、概念引入 在我们日常写代码过程中&#xff…

ARM学习(21)STM32 外设Can的认识与驱动编写

笔者来聊聊can的认识以及can接收数据的驱动编写 1、STM32 Can 外设的认识 Can的特性就不多说了,主要来聊聊can的一些标识符以及收发状态。can有一套收发机制,发送和接收都有硬件缓存,叫邮箱,通过下面的图可以看出,下面…

ESP32学习笔记 -- ESP32-S3 使用外部 PSRAM

ESP32-S3是乐鑫科技推出的一款专为物联网而生的SOC芯片,该芯片同时支持WIFI和BLE蓝牙功能,集成了高性能的Xtensa 32位LX7双核处理器,最高主频可达240MHz。 根据乐鑫官方资料介绍,该芯片内置512KB SRAM片上内存,并且具有45个可编程GPIO管脚和丰富的通信接口。为了更好地扩…

Flask框架之路由与蓝图的使用

路由与蓝图 路由路由概述路由的基本使用查看路由信息url_map对象命令行方式 HTTP请求方法 蓝图概述蓝图的基本使用蓝图的拆分指定蓝图的url前缀蓝图构造URL蓝图静态文件蓝图模板目录 路由 路由概述 在Flask中,路由用于将HTTP请求与特定的Python函数相匹配。通过定义…

K8s-Pod概念、创建及常用命令

文章目录 一、Pod概念1、Pod是什么?2、Pod网络共享实现方式3、Pod存储共享方式4、创建Pod整体流程 二、使用YAML文件定义Pod资源1、Pod资源清单YAML文件书写技巧1. YAML语法格式:2. 配置Linux tab缩进两个空格3. 使用kubectl explain帮助命令 2、创建Pod…

章节2:01-Java序列化和反序列化

章节2:01-Java序列化和反序列化 01-Java序列化和反序列化 基础环境 JDK解压版:包含Java运行时环境 IDEA:开发工具 Maven:jar包依赖管理 Tomcat:HTTP服务器 Burp Suite:发送HTTP请求 Kali&#xff1…

ANSYS APDL谐响应分析——悬臂梁的频响函数计算以及幅值、角度(相位)、分贝计算

问题描述 研究一根悬臂梁,材质为钢材。长度 L 2 L2 L2 米;截面为矩形,矩形的长度为 H 5 c m H 5cm H5cm,宽度为 B 2 c m B 2cm B2cm 。 建模思路: 先建立节点,然后用节点生成单元。使用n命令&…

book-riscv-rev1.pdf 翻译(自用,更新完成)第一章 操作系统接口

Job of operating system: 操作系统使得多个程序分享一台计算机,提供一系列仅靠硬件无法支持的服务。 管理与抽象低级别硬件(如:文件处理程序不需要关注使用哪种硬盘)使得多个程序分享硬件(programs that can run at…

797. 差分(C++和Python3)——2023.5.7打卡

文章目录 QuestionIdeasCode Question 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c ,表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数 n 和 m 。 第二…