leetcode刷题——复制带随机指针的链表

news2024/9/22 19:22:31

思维导图:

题目描述:

给你一个长度为 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 作为传入参数。

题目接口:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
    
	
}

 解题分析:

链表的深拷贝的意思就是在原链表的基础之上重新搞一个链表。这个链表与原链表一点关系都没有,但是这个链表却和原链表一模一样(链表的值和链表的值的指向相同)。

解题步骤:

1.复制原节点连接到原节点的后面。

2.将复制节点的random指针指向连接起来。

3.将原链表恢复并将复制链表尾插形成新链表。

解题代码:

struct Node* copyRandomList(struct Node* head) {
    //当原链表为NULL时直接返回NULL
    if(head == NULL)
    return NULL;

    //当链表不为NULL时便制造一个与原节点相同的节点连接到原链表后面
    struct Node* cur = head;
    //处理复制节点
    while(cur)
    {   //复制节点
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        //链接复制节点到原节点后面
        struct Node* next = cur->next;
        cur->next = copy;
        copy->next = next;
        //迭代
        cur = next;
    }
   //将拷贝链表的random链接上
   cur = head;
   struct Node* copy =cur->next;
   while(cur)
   {
       if(cur->random == NULL)
       {
           copy->random = NULL;
       }
       else
       {
           copy->random = cur->random->next;
       }
       cur = copy->next;
       if(cur)
       copy = cur->next;
   }
   
   //将原链表复原并拆下复制链表成为一个新链表
   cur = head;
   struct Node* copyhead = cur->next;
   copy = cur->next;
   struct Node* next = copy->next;
  while(next)
  {
      cur->next = next;
      copy->next = next->next;

      cur = next;
      copy = cur->next;
      next = copy->next;

  }
  cur->next = next;
  copy->next = next;

return copyhead;
	
}

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

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

相关文章

WPS Office AI实战:AI带来的文档智能化体验

前面我们已经了解过 AI 在PPT制作、Word写作方面带来的革命性效率提供,今天一起来聊聊在线文档的AI应用。如果你习惯用在线文档的话,一样也可以享受到AI的强大优势。金山在线智能云文档已经接入WPS Office AI套件大家庭,用AI来改造写作的新时…

QT day3作业

有点不对,不能运行了,怪事 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体 void Widget::on…

认识MQTT(C语言)

MQTT基础概念 MQTT 入门介绍 | 菜鸟教程 MQTT使用 在linux下搭建MQTT服务器(Broker) 在linux下执行下面命令安装MQTT服务器 📎mosquitto-1.6.3.tar.gzhttps://www.yuque.com/attachments/yuque/0/2023/gz/35243076/1687955850547-b594126…

003-Dubbo服务的发布和引用

目录 Dubbo3.0发布注册应用级注册-配置应用级注册-端口应用级注册-消费者-确定服务信息应用级注册-消费者-元数据中心 Dubbo3.0 发布注册 应用级注册-配置 因为接口级注册随着服务增多,注册中压力会越来越大 所以在3.0版本提供了应用级注册 #默认是all 接口和应…

两两交换链表中的节点——力扣24

题目描述 方法一:递归 class Solution{ public:ListNode* swapPairs(ListNode* head){if(!head || !head->next){return head;} ListNode* newHead head->next;head->next swapPairs(newHead->next);newHead->next head;return newHead;} }; 方法…

python以固定时间间隔取行

目录 1. 间隔取行2. 时间戳间隔取行:下采样参考链接 1. 间隔取行 dataframe 实现每隔 n 行取 1 行 近期在做数据分析的时候,用到了对csv文件每隔n行取1行的操作,正常情况下会立马想到for循环,可能大家还会有其他方法&#xff0c…

第八章——函数探幽

C内联函数 内联函数是为了提高程序运行速度所做的一项改进。常规函数与内联函数的主要区别不在于编写方式,而在于C编译器如何将它们组合到程序中。 对于 C内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到另一个位置处执行代…

LEADTOOLS V22 支持.NET 5-7.0 Crack

使用 LEADTOOLS 构建更好的应用程序 LEADTOOLS 由专利人工智能和机器学习算法提供支持,是一系列综合工具包,可将识别、文档、医疗、成像和多媒体技术集成到桌面、服务器、平板电脑、网络和移动解决方案中。 光学字符识别/ICR 以无与伦比的速度和准确性提…

Django系列所有漏洞复现vulhubCVE-2018-14574,CVE-2022-34265,CVE-2021-35042

文章目录 Django < 2.0.8 任意URL跳转漏洞&#xff08;CVE-2018-14574&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Trunc(kind) and Extract(lookup_name) SQL注入漏洞&#xff08;CVE-2022-34265&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Qu…

十五分钟逐步掌握关键路径问题(时间余量、关键活动以及关键路径的求解)

关键路径问题 名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 关键路径问题〇、概念说明1、AOE网2、关键路…

微服务系列文章之 nginx负载均衡

nginx负载均衡 负载均衡建立在现有网络结构之上&#xff0c;提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽&#xff0c;增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 随着网站的发展&#xff0c;服务器压力越来越大&#xff0c;我们可能首先会将数…

虚拟IP绑定公网IP访问

绑定公网 IP 我们目前的虚拟 IP&#xff0c;还不能通过公网的形式进行访问&#xff0c;我们首先&#xff0c;来使用内部的 IP 进行访问看看效果如下&#xff1a; curl 虚拟IP 如上图我访问了两次&#xff0c;第一次访问返回的是 2222 的 nginx&#xff0c;第二次访问是 1111 的…

【SpringCloud-9】JWT

这一篇主要介绍一下&#xff0c;微服务之间的用户权限问题。 通常呢&#xff0c;对于用户的登录鉴权&#xff0c;有两种方式&#xff1a; 1、基于session的方式&#xff1a; session是要存到服务端的&#xff0c;但是分布式服务太多&#xff0c;不可能每个服务端都存。 那就…

Python:文件选择界面 and 文件夹选择界面

文章目录 &#xff08;1&#xff09;文件选择界面&#xff08;2&#xff09;文件夹选择界面 Python本身没有内置的文件夹选择界面。然而&#xff0c;可以使用第三方库来实现在代码中选择文件或文件夹的功能。一个常用的库是tkinter&#xff0c;它是Python的标准GUI库之一&#…

IDEA中侧边栏没有git commit模块,如何恢复?

一、修改之前 侧边栏没有git commit模块 二、修改之后 侧边栏恢复了git commit模块 三、下面是恢复教程 1.中文版 打开 文件 -> 设置 -> 版本控制 -> 提交 -> 勾选 【使用非模式提交界面】 -> 点击【确定】 2.英文版 打开 file -> Settings -> Version Co…

ABB机器人在RobotStudio中进行数字与字符串相互转换的具体方法

ABB机器人在RobotStudio中进行数字与字符串相互转换的具体方法 如下图所示,打开RobotStudio软件,在RAPID—Module1中编写程序,首先声明几个测试需要用到的变量, 本例中利用 NumToStr 函数将数组变量中的元素依次转换成字符后赋值给tempString变量, 如下图所示,利用 StrTo…

第八章 npm锁定版本

1、历史原因 当我们走 npm install 带 ^ 会升级 为什么要锁版本 稳定大于一切 代码需要可控 风险可控 系统可控 环境需要一致

第四章 React18的重要更新和使用的新特性

1、7个新特性 2、3个新API 3、1个新模式 4、2个新并发API 1、7个新特性 Render API 使用了它才可以进入并发模式的渲染 setState自动批处理 有些情况&#xff0c;不希望合并处理 flsuhSync 关于卸载组件时的更新状态警告&#xff08;直接删除这个报错&#xff09; 关于r…

nacos启动问题整理

一 win下启动 1、nacos1.X启动 2、nacos2.X启动 2.x需要jdk11以上版本 1&#xff09;打开bin目录&#xff0c;修改startup.com脚本 启动模式&#xff0c;点击startup.cmd默认启动的集群模式&#xff0c;需要修改这个启动文件 2&#xff09; 连接mysql&#xff0c;执行sql…

【笔记】数字电路基础2 - 数制编码与逻辑电路

目录 数制、编码与逻辑代数数制编码逻辑代数 组合逻辑电路组合逻辑电路分析与设计编码器译码器加法器数值比较器数据选择器奇偶校验器 数制、编码与逻辑代数 数制 本小节主要陈述十进制、二进制、十六进制及其对应的转换法则&#xff0c;网上对应的文章已经有很多&#xff0c;…