数据结构之加餐篇 -顺序表和链表加餐

目录

  • 一、链表分割
  • 二、随机链表的复制
  • 总结


一、链表分割

链表分割
在这里插入图片描述
题目描述的意思就如下图:
在这里插入图片描述
也就是把1,2挪到前面,6,3,5挪到后面,前者的相对顺序不发生改变

这里要想往后挪就要先遍历,遍历到6比3小,这里要通过删除6这个节点然后尾插到后面来实现吗?这样就太麻烦了

思路:创建两个非空链表(小链表,大链表),遍历原链表,小的尾插到小链表中,大的尾插到大链表中(简单的将节点分为小于x的节点和大于等于x的节点),最终大链表和小链表首尾相连
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:这里第一个参数是链表,所以我们就加一个大括号,然后节点之间用逗号分隔,两个参数之间也要用逗号分隔
在这里插入图片描述
这串代码看似没有问题
在这里插入图片描述
然而提交出现了错误,出现内存超限的原因有两种,第一种是陷入死循环,第二种是无限递归(无线创建函数栈帧),首先排除死循环,因为自测结果没有出错,那么就是节点出现问题了
这里改一下节点顺序
在这里插入图片描述
在这里插入图片描述
发现出现死循环,1,2,5,3,6打印完之后又从2开始打印,6拿过来尾插之后,其的next指针没有发生改变,还是指向2这个节点
在这里插入图片描述
解决方法很简单,让大链表的尾节点置为空就好
在这里插入图片描述


二、随机链表的复制

随机链表的复制
在这里插入图片描述
补充一下题目中所说的深/浅拷贝是什么意思
浅拷贝:就是值拷贝
在这里插入图片描述
如图将pcur指向节点3进行浅拷贝,只需要让新的指针指向3即可
如果是深拷贝就要向操作系统额外申请一个节点大小的空间
在这里插入图片描述
乍一看这个题很简单
在这里插入图片描述
这里定义pcur来遍历原链表,只要节点不为空,就复制该节点
首先向操作系统malloc一块一摸一样节点大小的空间
在这里插入图片描述
新的节点的值和原节点相等,next和random的值初始情况下置为空,接下来pcur往后走,只要节点不为空,就把13这个节点拿到复制链表进行尾插,新节点的13(next,random都默认为空),新节点7的next指针指向13
在这里插入图片描述
依次类推
在这里插入图片描述
但是尾插的时候只能设置当前节点里的值和next指针,这个random指针怎么做呢?
如果我再让pcur回到第一个节点,发现原链表的random指针置为空,便让新链表的random指针置为空
在这里插入图片描述
还需要定义一个指针遍历新的链表,也就是操作完一个节点pcur和copy都要往后走,但是发现13的random指针指向前一个节点,单链表又是单向的,这里是头节点
在这里插入图片描述
如果10的random节点指向13,这就不好找了,又要从头向后遍历

新的思路:(1)就是在原链表的基础上拷贝节点

在这里插入图片描述
从头开始遍历,遍历到7,创建一个和7一摸一样的节点(malloc),然后让newnode尾插到pcur节点之后,newndoe的next指针指向pcur的下一个节点,pcur的下一个节点用next保存

尾插之后pcur指向其原来指向的next节点,只要13这个节点不为空,再深拷贝一个13节点,然后把新的节点拿到13节点之后尾插,然后pcur->next指针指向newnode,newnode->next指针指向next节点,以此类推,循环往复
在这里插入图片描述
pcur跳出循环,不能对空节点进行深拷贝

(2)设置random指针

在这里插入图片描述
这里原链表中7的random指针置为空,那么复制节点的ramdom也置为空,然后copy往后走,cur也往后走(这里cur原来是在原节点7的位置)
原链表13的random指针是7,那么copy节点的random指针满足下面的条件,当原链表里的random指针不为空,就满足这样一个规则
在这里插入图片描述
cur->random指针指向7,其的next节点就是复制节点的random指针指向的节点

此时copy和cur都往后走,以此类推,循环往复
在这里插入图片描述
此时只要cur的random指针不为空,就可以执行该规则
在这里插入图片描述
在这里插入图片描述
当cur为空,拷贝节点的random指针都设置完了

(3)断开新旧链表

在这里插入图片描述
这里断开可以让拷贝节点指向其下一个节点,原链表的next指针其实不用管,虽然原链表的next指针指向新链表,但是并不影响新链表,新链表连到一起打印的时候,并不会打印到原链表里面

所以这里新旧链表的断开可以让新链表的next指针指向自己的节点,也可以让原链表的next指针也指向自己的节点,改不改都不影响,这里我就不管了,只要新链表是独立的链表就好了

这里拷贝链表的头和尾初始情况下指向pcur的下一个节点,只要copyTail的下一个节点不为空,就意味着pcur的下一个节点非空,让pcur走到复制节点尾节点的下一个节点,再让复制节点7的next指针不再指向原节点13,而是指向pcur的下一个节点,此时pcur的下一个节点就是新节点13,此时13称为拷贝链表的新的尾节点,这里要两张图结合来看
在这里插入图片描述
以此类推,循环往复
在这里插入图片描述
这里只要copyTail的下一个节点不为空,这里pcur可以走到copyTail的下一个节点,再让copyTail->next指针指向pcur的下一个节点
在这里插入图片描述
然后1变为新的尾节点,这里copyTail的下一个节点为空了,此时就把旧链表从新链表里面断开了。

直接返回拷贝后链表的头节点就好了

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/typedef struct Node Node;//创建新节点Node* buyNode(int x){Node* newnode=(Node*)malloc(sizeof(Node));newnode->val=x;newnode->next=newnode->random=NULL;return newnode;}//在原链表的基础上拷贝节点插入原链表中
void AddNode(Node* head)
{Node* pcur=head;while(pcur){Node* newnode=buyNode(pcur->val);Node* next=pcur->next;newnode->next=next;pcur->next=newnode;pcur=next;}
}//设置random
void setRandom(Node* head)
{Node* pcur=head;while(pcur){Node* copy=pcur->next;if(pcur->random){copy->random=pcur->random->next;}pcur=copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}//在原链表的基础上拷贝节点并插入到原链表中AddNode(head);//设置randomsetRandom(head);//分开新旧链表Node* pcur=head;Node* copyHead,*copyTail;copyHead=copyTail=pcur->next;while(copyTail->next){pcur=copyTail->next;copyTail->next=pcur->next;copyTail=copyTail->next;}return copyHead;
}

总结

第二道题彻底把博主写傻了,论写到最后图都背下来了的救赎感(

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

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

相关文章

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南 概述 在Java Web开发领域,JSP(JavaServer Pages)与Servlet是构建动态Web应用的核心技术组合。Servlet作为Java EE的基础组件,负责处理客户端请求、执行业务逻…

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件: small.xlsx: 包含约5,000条记录。large.xlsx: 包含约140,000条记录。 目标:快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录,并将这些匹配的记录保…

Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总

目录:🧠 一、Spring 框架概述1. Spring 的核心功能2. Spring 模块化结构🧩 二、IoC(控制反转)核心知识点1. IoC 的核心思想2. Bean 的定义与管理3. IoC 容器的核心接口4. Spring Bean 的创建方式🧱 三、AOP…

简单工厂模式(Simple Factory Pattern)​​ 详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页: Meteors.的博客 💞当前专栏: 设计模式 ✨特色专栏: 知识分享 &…

新电脑硬盘如何分区?3个必知技巧避免“空间浪费症”!

刚到手的新电脑,硬盘就像一间空荡荡的大仓库,文件扔进去没多久就乱成一锅粥?别急,本文会告诉你新电脑硬盘如何分区,这些方法不仅可以帮你给硬盘分区,还可以调整/合并分区大小等。所以,本文的分区…

【微知】git submodule的一些用法总结(不断更新)

文章目录综述要点细节如何新增一个submodule?如何手动.gitmodules修改首次增加一个submodule?git submodule init,init子命令依据.gitmodules.gitmodules如何命令修改某个成员以及同步?如果submodule需要修改分支怎么办&#xff1…

【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南

文章目录一、Seata 框架概述二、核心功能特性三、整体架构与三大角色1. Transaction Coordinator (TC) - 事务协调器(Seata Server)2. Transaction Manager (TM) - 事务管理器(集成在客户端)3. Resource Manager (RM) - 资源管理器…

AI赋能!Playwright带飞UI自动化脚本维护

80%的自动化脚本因一次改版报废? 开发随意改动ID导致脚本集体崩溃?背景UI自动化在敏捷开发席卷行业的今天,UI自动化测试深陷一个尴尬困局:需求迭代速度(平均2周1次)> 脚本维护速度(平…

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南 1. 问题背景介绍 在分布式系统中,多节点并发访问共享资源时,如果不加锁或加锁不当,会导致数据不一致、超卖超买、竞态条件等问题。常见的分布式锁方案包括基于Redis、Zoo…

网络安全A模块专项练习任务十一解析

任务十一:IP安全协议配置任务环境说明: (Windows 2008)系统:用户名Administrator,密码Pssw0rd1.指定触发SYN洪水攻击保护所必须超过的TCP连接请求数阈值为5;使用组合键winR,输入regedit打开注册表编辑器&am…

金蝶中间件适配HGDB

文章目录环境文档用途详细信息环境 系统平台:Microsoft Windows (64-bit) 10 版本:5.6.5 文档用途 本文章主要介绍金蝶中间件简单适配HGDB。 详细信息 一、金蝶中间件Apusic安装与配置 1.Apusic安装与配置 Windows和Linux下安装部署过程相同。 &…

使用a标签跳转之后,会刷新一次,这个a标签添加的样式就会消失

<ul class"header-link"><li><a href"storeActive.html">到店活动</a></li><li><a href"fuwu.html">服务</a></li><li><a href"store.html">门店</a></l…

线程池实现及参数详解

线程池概述 Java线程池是一种池化技术&#xff0c;用于管理和复用线程&#xff0c;减少线程创建和销毁的开销&#xff0c;提高系统性能。Java通过java.util.concurrent包提供了强大的线程池支持。 线程池参数详解 1. 核心参数 // 创建线程池的完整构造函数 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(动态存储供应)

K8S 部署 NFS Dynamic Provisioning&#xff08;动态存储供应&#xff09; 本文档提供完整的 K8s NFS 动态存储部署流程&#xff0c;包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。 2. 部署步骤 2.1 创建命名空间 首先创建独立的命名空间 …

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:从RNN到LSTM与GRU

本文将深入探讨循环神经网络&#xff08;RNN&#xff09;的核心原理、其面临的长期依赖问题&#xff0c;以及两大革命性解决方案——LSTM和GRU的门控机制&#xff0c;并通过实例和代码帮助读者彻底理解其工作细节。1. 引言&#xff1a;时序建模的数学本质在上一篇概述中&#x…

Qt---状态机框架QState

QState是Qt状态机框架&#xff08;Qt State Machine Framework&#xff09;的核心类&#xff0c;用于建模离散状态以及状态间的转换逻辑&#xff0c;广泛应用于UI交互流程、设备状态管理、工作流控制等场景。它基于UML状态图规范设计&#xff0c;支持层次化状态、并行状态、历史…

GitHub 热榜项目 - 日榜(2025-09-02)

GitHub 热榜项目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 统计摘要 共发现热门项目&#xff1a;14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现AI Agent生态爆发趋势&#xff0c;Koog、Activepieces等项目推动多平台智能体开发框架成熟。语…

华为卫星对星引导技术深度解析:原理、实现与开源替代方案

利号&#xff1a;CNXXXXXX 涉及多传感器融合/自适应波束成形/轨道预测算法一、技术原理剖析&#xff1a;卫星间高精度指向的核心挑战在低轨卫星&#xff08;LEO&#xff09;星座中&#xff0c;卫星间链路&#xff08;ISL&#xff09;的建立面临三大技术难题&#xff1a;1. 动力…

水下管道巡检机器人结构设cad+三维图+设计说明书

目 录 1 绪论 1 1.1 选题的背景及意义 1 1.2 水下管道巡检机器人的分类 2 1.2.1 管道巡检技术的分类 2 1.2.2管道巡检机器人的分类 2 1.3 研究的现状 3 1.3.1 国内的研究现状 3 1.3.2 国外的研究现状 4 1.4 水下管道巡检机器人的发展趋势 5 1.…