赋值带随机指针的链表

news2024/11/14 20:49:49

给你一个长度为 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 指针的复制,比如上述的例子,第二个结点 " 13 " 的 random 指针 " 7 " 这个结点,那么我们在新的链表空间中,如果和去找到这个 原链表 " 7 "  对于新链表的 " 7 " 这个位置。

我们不能按照 值 去查找,比如上述中 我们想要找到 值为 " 7 " 这个结点,因为 链表中可能有多个 值为 " 7 " 的结点。如果按照地址去查询也是不行的,因为我们只能通过循环 在原链表中找到对应结点的地址,但是我们是在新的链表中进行random指针的查找,新的链表和 原链表地址是不同的。

如果我们想要按照 地址去查找,就只能通过相对地址来寻找,但是很麻烦,简单俩说就是,如上例子,我们想要找到 13 的random 指针位置,13 的random 指针指向的位置是 13 这个结点的 -1 的相对位置; 11 这个结点的 random指针指向位置就是 1 这个结点,1 这个结点 的相对位置就是 11 的 2 的这个相对位置。

 或者说是,找到 在新链表中 位于第几个 结点,虽然地址 ,新链表和 原链表对不上,但是从起始位置开始数的个数,是对应上的。用这种方法,时间复杂度是 O(n^2)。

或者我们可以创建两个指针数组,一个按照链表顺序存储 原链表 各个结点的地址,一个存储 新链表结点地址,然后我们在 原链表中 找到某一个结点的random 所在 链表的位置,这个位置也就对应这个数组的下标,那么我们可以在 存储 新链表结点 的数组 同一下标位置找到 新链表当中 这个结点 的 random 指针链表当中的位置,如下图所示:

 下标是 可以视为 这个结点在链表当中的相对位置。但是这个方式只是比之前快一点点,不能优化到 O(n)。

更优解是:

我们在原链表的每一个结点后,都创建一个新的结点,这个结点和前一个结点的值相同,如下图所示(拷贝结点链接到源节点的后面):

 那么我们之前的难点是在,我们在 新链表的当中找不到 结点的 random 指向的地址,那么现在我们就可以找到了,如上述,红色的 结点就是我们的 新链表的结点,红色的 13 这个结点的 random指针 就应该 红色 7  这个结点,而 7 这个结点的位置就在 原链表 7 这个结点的后面,那么同样的,其他的结点也是一样的,都是在 原链表 random 指针指向结点的后一个结点。

然后就可以通过上述关系来把红色结点,也就是新的链表结点 的 random 指针的进行修改。

最后就是 把 拷贝结点解下来连接成一个新的链表,把原链表恢复。

具体代码实现:

 

struct Node* copyRandomList(struct Node* head) {
	struct Node* cur = head;
    while(cur)
    {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;

        //修改链表当中的链接关系
        struct Node* tmp = cur->next;
        cur->next = copy;
        copy->next = tmp;

        // cur 往后迭代
        cur = tmp;
    }

    // 处理 结点的 random 指针
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        if(cur->random == NULL)
        {
            copy->random = NULL;
        }
        else
        {
            copy->random = cur->random->next;
        }
        cur = copy->next;
    }

    // 把 拷贝结点链接为新的链表,把原链表恢复
    struct Node* copyhead = NULL, *copyTail = NULL;
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        
        // copy 尾插
        if(copyhead == NULL)
        {
            copyhead = copyTail = copy;
        }
        else
        {
            copyTail->next = copy;
            copyTail = copyTail->next;
        }

        // 恢复原链表
        cur->next = next;

        // cur 跌倒往下走
        cur = next;
    }

    return copyhead;
}

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

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

相关文章

云主机如何恢复备份和挂载备份

一、挂载备份(优先推荐) 1、windows系统: 在主机管理界面,点击【挂载备份盘】 挂载完成以后远程连接到服务器,右键 我的电脑--管理--磁盘管理 可以看到未分配的磁盘 右键未分配的磁盘--更改驱动路径--添加 给磁盘指定一个盘符。…

C++学习day--02 C++语法规则

1、回顾 通过第一天的学习&#xff0c;我们搭建好了开发环境&#xff0c;并打印了你好&#xff0c;现在做一个案例&#xff1a;自己跟着敲写出来&#xff1a; #include <iostream> #include <Windows.h> int main(void) { std::cout << "1.网站 404 攻…

SPSS如何进行相关分析之案例实训?

文章目录 0.引言1.双变量相关分析2.偏相关分析3.距离分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对相关分析进行阐述。 1.双…

ubuntu(22.04)--常用命令(2)-awk-sed-find-cut-xargs-grep-curl-tee-wc-sort

1.awk 它逐行处理数据&#xff0c;特别适用于从文件中提取特定的数据。例如&#xff0c;您可以使用以下命令从CSV文件中提取数据的第一列&#xff1a; #1.awk awk -F , {print $1} linuxmi.csv#指定分割符#第一列# 待处理文件$ awk [options] [file] #1.打印第2列awk ‘{pr…

IPC<进程间通信>之共享内存-源代码在结尾处

一&#xff0c;什么是共享内存 共享内存是进程间通信的一种方式&#xff0c;相较于传统的管道和命名文件的通信方式&#xff0c;shared memory是最快的一种方式&#xff0c;但是他也有一定的缺陷&#xff0c;下面再谈。 共享内存区是最快的IPC形式。一旦这样的内存映射到共享…

从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)

目录 0. 引入6个默认成员函数 1. 构造函数&#xff08;默认成员函数&#xff09; 1.1 构造函数的概念 1.2 构造函数的特性和用法 1.3 默认构造函数 2. 析构函数&#xff08;默认成员函数&#xff09; 2.1 析构函数概念 2.2 析构函数特性 3. 拷贝构造函数&#xff08;默认成员函…

附录2-购物车案例

目录 1 效果 2 接口数据 3 App.vue 4 HEADER.vue 5 COUNT.vue 6 GOODS.vue 7 FOOTER.vue 1 效果 由四种子组件和一个App.vue构成 2 接口数据 返回结果如下 {"status": 200,"message": "获取购物车列表数据成功&#xff01;",&q…

idea中的debug操作详解

行断点 默认模式 方法断点 菱形&#xff0c;加在方法前&#xff0c;用的比较多的地方&#xff1a;加在接口前会进入这个接口的实现类。 异常断点 如果说你的程序抛了某个异常&#xff0c;你需要知道在哪里抛出的&#xff0c;可以直接设置异常断点&#xff0c;设置后程序会…

Shell脚本之循环语句(for、while、until)

目录 一、echo命令二 for循环语句三 while循环语句结构(迭代&#xff09;四. until 循环语句结构五.continue和break和exit 一、echo命令 ?echo -n 表示不换行输出 echo -e 输出转义字符&#xff0c;将转义后的内容输出到屏幕上 常见转义字符&#xff1a; 二 for循环语句 用法…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置自动亮度调整BrightnessAuto(自动曝光自动增益)(C++)

自动亮度调整项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0…

北斗哨兵北斗短报文远程监控系统解决方案

一、项目背景 随着社会发展各行各业都会遇到各种各样的安全问题&#xff0c;监控系统作为安防的第一线安防设备也已广泛部署&#xff0c;然而地处偏僻的监控区域往往面临着难以提供电力供应以及网络供应的问题&#xff0c;类似于山区环境监测&#xff0c;工地监测等复杂的环境布…

Web自动化测试流程:从入门到精通,帮你成为测试专家

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 摘要&#xff1a; 步骤一&#xff1a;选取测试工具 步骤二&#xff1a;编写测试用例 步骤三&#xff1a;编…

5月4号软件资讯更新合集.....

&#x1f680; Layui 2.8.2 发布 更新日志 table 修复 autoSort: true 时&#xff0c;更改 table.cache 未同步到 data 属性的问题 修复 多级表头存在 hide 表头属性时&#xff0c;执行完整重载可能出现的错位问题 修复 未开启 page 属性时底边框缺失问题 优化 打印内容中…

大型游戏剧本杀小程序app

大型游戏剧本杀小程序的发展趋势主要表现为以下几个方面&#xff1a; 社交互动&#xff1a;未来大型游戏剧本杀小程序将会更加注重社交互动&#xff0c;为用户提供更多的沟通方式和社交场景&#xff0c;以增强玩家间的互动和参与感。 智能化和AR/VR技术应用&#xff1a…

网络基础项目——全网互通实验

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会讲解网络基础项目——全网互通实验。 一.实验项目图 二.实验要求 1.全网互通,所有PC机能访问服务器(ping)2.路由器…

DA-Net:用于视网膜血管分割的双分支Transformer和自适应条带上采样

文章目录 DA-Net: Dual Branch Transformer and Adaptive Strip Upsampling for Retinal Vessels Segmentation摘要本文方法整体框架Transformer LayerAdaptive Strip Upsampling Block 实验结果消融实验 DA-Net: Dual Branch Transformer and Adaptive Strip Upsampling for R…

【Python习题集6】类与对象

类与对象 一、实验内容二、实验总结 一、实验内容 1.设计一个Circle类来表示圆&#xff0c;这个类包含圆的半径以及求面积和周长的函数。在使用这个类创建半径为1~10的圆&#xff0c;并计算出相应的面积和周长。 半径为1的圆&#xff0c;面积: 3.14 周长: 6.28 半径为2的圆&am…

【虹科案例】虹科任意波形发生器板卡在声场模拟实验中的应用

声场模拟实验介绍 声场模拟实验是一种通过模拟不同环境下的声场特征来模拟真实世界中声音传输情况的实验方法。通过模拟不同环境下的声场特征&#xff0c;如空间分布、强度、频率等&#xff0c;来模拟真实世界中的声音传输情况&#xff0c;从而对声学相关问题进行研究。 在声…

Java集合框架知识总结

前言 Java集合框架主要由两个接口及其下面的实现类构成&#xff0c;这两个接口分别是Map接口和Collection接口&#xff0c;下面先通过其对应的UML类图看下这两个接口的具体实现&#xff0c;如下 1、Map接口 Map接口的主要实现有我们熟悉的HashMap、HashTable以及TreeMap、Con…

信息技术发展

OSI网络标准协议 物理层&#xff1a;联网的媒介 RS232 FDDI 数据链路层: 网络层接收到的数据分割成可被物理层传输的帧 IEEE802.3/.2 ATM 网络层&#xff1a;网络地址翻译成对应的物理地址&#xff0c;路由 IP ICMP IGMP IPX ARP 传输层&#xff1a;端到端的错误恢复和流量控制…