【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

目录

 1.随机链表的复制

1.2题目描述 

1.3题目分析

1.4解题:

2.顺序表和链表对比

2.1cpu高速缓存利用率

3.结语


 1.随机链表的复制

一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random 

该指针可以指向链表中的任何节点或空节点。 

 

 

 

1.2题目描述 

构造这个链表的 深拷贝。 深拷贝应该正好由 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.3题目分析

首先,链表的拷贝如果是普通链表的话,使用遍历+尾插即可。

深度拷贝就是要链表结构也一样

但是由于随机指针的存在。我们没办法知道或者就是说我们拷贝的节点的随机指针该指向那个位置。那么就有一种简单粗暴的方法:

遍历链表然后匹配随机指针。

那么巧妙的一种办法,就是将复制的节点插到被复制节点的后面,这种方法巧妙。时间复杂度为O(N).空间复杂度也为O(1).

while(cur)//循环申请插入
    {
        //每次都申请节点
         struct Node* copy = ( struct Node*)malloc(sizeof( struct Node));
         //尾插
         cur->val = copy->val;
         cur ->next = copy;
         copy->next = next;
         cur = next;
         //往后走一步
         next = cur->next;

    
    }

 那么对于随机指针的连接:

我们发现,我们原链表的节点的随机指针指向的节点的next刚好就是我们复制链表节点的随机指针要指向的节点,所以:

 //还要使用cur遍历
    cur = head;
    struct Node* copy = cue->next;
    while(cur)
    {
        if(cur->random == NULL)
        {
            copy->random = NULL;
        }
        else
        {
            copy->random = cur->random->next;
        }
        cur = copy->next;
        copy = cur->next;
    }

然后我们将复制的节点从原链表取下来尾插成新的链表,复原原链表就OK了:

1.4解题:

 

struct Node* copyRandomList(struct Node* head) {
	
    //1.首先先将复制的节点尾插到各个节点的后面
    assert(head);//断言,不能传入一个空链表
    struct Node* cur = head;
     struct Node* next = cur->next;

    while(cur)//循环申请插入
    {
        //每次都申请节点
         struct Node* copy = ( struct Node*)malloc(sizeof( struct Node));
         //尾插
         cur->val = copy->val;
         cur ->next = copy;
         copy->next = next;
         cur = next;
         //往后走一步
         next = cur->next;

    
    }

    //还要使用cur遍历
    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;
        copy = cur->next;
    }
     cur = head;
      struct Node* copyhead = NULL;//新链表的头结点
       struct Node* copytail = NULL;//定义一个尾结点方便尾插
       //还是遍历解除复原
       while(cur)
       {
           copy = cur->next;
           next = copy->next;
           //将cope结点开始尾插
           if(copytail == NULL)//此时新链表一个元素都没有
           {
               copyhead = copytail = copy;
           }
           else
           {
               copytail->next = copy;
               copytail = copytail->next;
           }
           cur ->next = next;
           cur =next;


       }
       return copyhead;

}

2.顺序表和链表对比

    不同点                 顺序表                                                                   链表

存储空间上    物理上一定连续                                           逻辑上连续,但物理上不一定 连续

随机访问         支持O(1)                                                            不支持:O(N)

 任意位置插入或者删除元素可能需要搬移元素,效率低 O(N)     只需修改指针指向 

插入          动态顺序表,空间不够时需要 扩容                                没有容量的概念

应用场景       元素高效存储+频繁访问                                    任意位置插入和删除频繁 

缓存利用率                    高                                                                  低

2.1cpu高速缓存利用率

硬件上的存储分层如下图:

 

3.结语

 链表和顺序表的知识到这里基本就告一段落,那么大家可以从知识到解题详细回顾一下。

可以结合图解多看一下代码,结合理解。以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,数据结构内容持续更新中,感谢大家的关注与喜欢。

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

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

相关文章

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB) 论坛为局域网论坛,仅供内部同事交流使用! 使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M)…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject? 在游戏开发中,有大量的配置数据需要存储,这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt,excel等等 但是你们有没有想过,假设你使用的是json&#x…

Python 面向对象编程——类的使用

一、学习目标 1.掌握类的定义和实例化对象。 2.熟练掌握类的构造函数__init__使用。 3.掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy(),创建名字为“小汽车”、“手枪”和“积木”的玩具实例,计…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier,可根据开发者需要动态设置属性。 stateStyles stateStyl…

微信报修小程序源码

源码获取方式: 1、搜一搜 万能工具箱合集 然后点击资料库,即可获取资源 一、先看Demo(已更新至4.0.0) 想看界面图片的,辛苦你爬一下楼,点击下方查看资源,进入官方demo 二、功能介绍 1、当前版…

二路归并排序的算法设计和复杂度分析and周记

数据结构实验报告 实验目的: 通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。 实验内容: 二路归并排序的算法设计和复杂度分析 实验过程: 1.算法设计 第一步,首先要将数组进行…

计算机网络-第3章 数据链路层

主要内容:两个信道及对应的协议:点对点信道和广播信道,扩展以太网和高速以太网 本章的分组转发为局域网内的转发,不经过路由,网络层分组转为为网络与网络之间的转发,经过路由。局域网属于网络链路层的范围…

苹果群控功能解析与代码分享!

随着移动互联网的飞速发展,智能设备日益普及,苹果设备因其出色的用户体验和稳定的性能受到了广大用户的喜爱,然而,对于开发者而言,如何有效地管理和控制大量的苹果设备成为了一个亟待解决的问题。 一、苹果群控功能概…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

回收小程序开发,降低企业成本,提高回收利润

近年来,人们的回收意识逐渐强烈,废品回收行业发展非常迅猛,促进了我国的资源回收再利用,我国回收行业也将迎来新的发展机遇。 随着市场规模的扩大,回收行业也正在逐步进行创新。在互联网的支持下,行业中也…

只会Vue的我,用两天学会了react,这个方法您也可以

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战明年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 背景 由…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展,现在人们获取最新资讯的主要途径来源于网上新闻,当下的网上信息宣传门户网站的发展十分的迅速。而保险产品,作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

保护模式笔记九 中断门和IDT(中断描述符表)

段选择子: 先直观认识一下GDT和段选择子在逻辑地址转换为线性地址中的作用,例如: 给出逻辑地址:21h:12345678h,需要将其转换为线性地址 a. 选择子SEL21h0000000000100 0 01b,他代表的意思是&#xff1a…

操作系统--绪论

这里写目录标题 什么是操作系统(OS)硬件工作示例引入操作系统目标计算机的产生图灵机通用图灵机计算机 启动电源键开启后,计算机干了什么二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目…

洛谷P8888(吉利题) 实验基地

今天来水一期吉利题。 提醒一下,虽然编号很吉利,但内容可不吉利,做好心理准备!!! 题目背景 小 A 和小 B 用实验基地全新的装备进行了一场世纪蒟蒻之战。 题目描述 众所周知,实验基地的武器…

静态时序分析:SDC约束命令set_disable_timing详解

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定对象列表 指定源、目的引脚 指定恢复 简单使用 写在最后 上一章中,我们学习了如何使用set_case_analysis模式分析命令,它通过指定某个端口或引脚为固定值&…

B3619 10 进制转 x 进制

题目描述 给定一个十进制整数 n 和一个小整数 x。将整数 n 转为 x 进制。对于超过十进制的数码,用 A,B ... 表示。 输入格式 第一行一个整数 n; 第二行一个整数 x。 输出格式 输出仅包含一个整数,表示答案。 输入输出样例 …

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H,这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽,并拥有36GB的存储容量,相较于之前的8层堆叠HBM3 8H,在带宽和…

鸿蒙 Stage模型-应用组件-配置、UIAbility

前提:基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌) 一、概念 可以看到分为运行期、编译器,主要关注UIAbility(类似Activity,UI相关&#xff0…

MySQL面试题纯享版

基础内容 1、MySQL的架构分层 2、一条 SQL 查询语句的执行流程 3、如何查看 MySQL 服务被多少个客户端连接了? 4、 空闲连接会一直占用着吗? 5、MySQL 的连接数有限制吗? 6、 怎么解决长连接占用内存的问题? 7、执行器与存储引擎…
最新文章