链表相关题目(数据结构期末复习)

news2024/9/25 7:19:21

题目要求

下面算法 FB1 将一个带头节点的单链表LA 分解为两个具有相同结构的单链表 LB,LC, 其中LB中节点为LA中值小于0的节点,而LC中节点为LA中值大于或等于0的节点。请在空白处填上合理的语句。

翻译:LA 初始链表;LB.val from LA which <0; LC.val >=0 from LA ,too.

void FB1(LinkList &LA,LinkList &LB,LinkList &LC){
	LinkList p,q;
	LB=LA;
	p=__①__;
	LB->next=NULL;
	LC=new LNode;
	LC->next=NULL;
	while(p){
		q=p->next;
		if(__②__){
			p->next=LB->next;
			LB->next=p; 
		}else{
			p->next=LC->next;
			LC->next=p;
		}
		__③__; 
	}
}

做题思路

自己假设多组数据,跟着代码去走一走,想着这行代码怎么写,才能正确处理咱自己写的数据,
看第一空吧先

第一空(假设链表LA为空)

处理结果应该是怎样的?LB和LC最后应该变成什么样?

在这里插入图片描述

先给极端数据求好求的空:也就是第一空
如果咱的LA链表 只有一个头结点,后边儿 啥也没有
在这里插入图片描述
那调用完FB1函数,LB和LC应该也和LA长的很像,都是只有头结点,然后直接指到空

在这里插入图片描述
那咱第一空,该怎么填才能让函数实现这种效果?

p=LA->next;
//或者让p=LB->next,因为上边先让LB=LA了,所以LA的next和LB的next暂时相等

因为 LA只有一个头结点,所以LA->next 指向的是空,p也就为空,
就一次也进不去while循环了,也不用进(不理解为什么不用进while循环,往下继续看)
因为while循环上边几行代码已经把LB和LC处理成咱想要的结果了

while循环上边几行代码都干了什么?

LB=LA;//把LA赋给LB, 也就是我们现在拿着LB用,就和拿着LA用效果一样。

上面画的LB的图其实有点问题,再给你重画一个
在这里插入图片描述

而LC创建的时候,

LC=new LNode; //LC的头结点有了
LC->next=NULL;//LC的next也指到空了,
				//已经实现最后的LC只有一个头结点的结果,不用再考虑
				//(一会儿填后两个空,再考虑)

为什么不用进while循环?

在C语言里边儿,0和空 到了 布尔表达式里 都可以起到false的效果,让判断条件为假,跳过循环。
咱通过 p=LA.next,让p指到了空,到了while循环判断的时候,直接就跳过循环了。

调用函数,实现了功能就该返回了,再进循环里边儿转,不就浪费时间了吗?(本来就该这样设计程序的。)

后两空(还是通过给具体的数据求解)

先再写一下FB1的代码

void FB1(LinkList &LA,LinkList &LB,LinkList &LC){
	LinkList p,q;
	LB=LA;
	p=LA.next;//已经写上①了
	LB->next=NULL;
	LC=new LNode;
	LC->next=NULL;
	while(p){
		q=p->next;
		if(__②__){
			p->next=LB->next;
			LB->next=p; 
		}else{
			p->next=LC->next;
			LC->next=p;
		}
		__③__; 
	}
}

假设LA 为[1],只有一个元素 正1

首先进到循环中
刚才不是说
p指向的是LA的next吗?
在这里插入图片描述
p的next 为null

q=p->next;

现在q也是null了

然后再接着往下看
呃,先考虑最后LB和LC该张什么样吧

在这里插入图片描述
应该是 LC里有一个1,LB还是光个头结点

那咱肯定是让 if()这里为假,然后走else 去操作LC呀
if语句里边 都是 LB的事儿,走它没用,

抛开代码不谈,但看题目要求,那也是根据元素的正负 来看它该进LB 还是该进 LC的

②这里应该和元素的正负关联起来,大于等于0的时候,就让布尔表达式的结果为假,走else语句,否则就走if
(自己捋一捋就好了,它题里已经把LB写在if里了,只能顺着它的来写if的判断语句)

在这里插入图片描述
谁能表示这个元素,有很多,这里咱先用p.val表示(value,值)

if(p.val<0){
}else{
}

这样写好像可以让这个元素(红色的1)去到else里边 操作
(如果②写成p.val不行,一会儿出问题了,咱在回来找别的能表示元素值的方法。如果没问题,一会儿把③也填了,这里也还能填它,那就它了)

else 语句执行效果演示

...
else{
	p->next=LC->next;
	LC->next=p;
}
...
原来的

在这里插入图片描述

p->next=LC->next;之后

LC的next是什么意思?
LC是LC这个链表的头结点,LC的next 连着的是一整个链表
LC->next 可以理解为 LC这个链子上,头结点后边的整个链
也就是这个部分(这里咱用的都是比较简单的特殊情况,数据量有点少,你可以当LC后边有1万个节点,然后再接着往下看)
在这里插入图片描述
p->next=LC->next;整体是什么意思?
让p的next指针 指向 LC->next这个链,↓
在这里插入图片描述

LC->next=p

LC是LC链表的头结点,头结点的next 指到一个节点上,其实挺好理解的
在这里插入图片描述
拉直一下
在这里插入图片描述
看清了吧。

因为我们这里只假设LA有一个元素,所以处理了一个节点之后,也就该退出循环了,而且现在p->next不就指向null嘛,一会儿再进行while循环条件判断的时候,结果也是假,也会出循环的,就结束了。

第三空

现在已经出来if-else了
该执行第三空的语句了
刚才给的两组数据分别是空 和 1
这次咱就给两个数吧[1,2]

刚进循环
注意乃条红线,咱代码里面有一句 LB->next=NULL,就相当于是把红线给断了,让LB的next 指到空,不然就会出现上图乃种情况——到最后LB 还有根线连着1,和正确结果不一样。
在这里插入图片描述

处理完1之后三个链表应该是什么样?
在这里插入图片描述
现在,假如没有第③句,那p还是指向1,循环判断的还是1,又重复对1操作,死循环了
所以在③这里我们需要的操作应该是让p指针“往后移”,指到原来1后边乃个元素也就是2
怎么指过去?
你猜q是干嘛的?
让p=q不就行了
在这里插入图片描述
然后再接着走循环
处理元素2
在这里插入图片描述
在这里插入图片描述

回顾

带头结点的链表长什么样?
分别画出链表为 没有元素、[1]、[1,2],的图

补全代码,设计几组特殊数据,一点一点看代码就行,可以一组数据针对一个空。

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

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

相关文章

Python图像文字识别详解,实战代码

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在现代计算机视觉和图像处理应用中&#xff0c;文字识别是一个重要的任务。本篇博客将详细介绍如何使用Python中的文字识别库&#xff0c;以及一些优秀的开源工具&#xff0c;来实现对图片中文字的准确识别。通过…

从学到考,一图带你读懂开发者技能成长秘籍

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…

【Spring学习笔记】Spring 注解开发

Spring学习——注解开发 注解开发注解开发定义bean纯注解开发 Bean管理bean作用范围bean生命周期 依赖注入自动装配 第三方bean管理注解开发总结XML配置与注解配置比较 注解开发 注解开发定义bean 使用Component定义开发 Component("bookDao") public class BookD…

【Python可视化系列】一文教会你绘制美观的直方图(理论+源码)

一、引言 前面我详细介绍了如何绘制漂亮的折线图和柱状图&#xff1a; 【Python可视化系列】一文彻底教会你绘制美观的折线图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的柱状图&#xff08;理论源码&#xff09; 对于一个连续性的变量&#xf…

spring三级缓存之相互依赖

spring三级缓存之相互依赖 什么是sping的互相依赖sping的三级缓存三级缓存存储了什么内容&#xff1f;三级缓存的存在是为了解决什么问题&#xff1f;三级缓存的怎样解决互相依赖的问题&#xff1f;缓存解决A和B相互依赖的过程三级缓存解决AOP并且A和B互相依赖的过程 三级缓存所…

Python 操作mysql实现事务处理

一、应用场景 Python项目对MySQL数据库进行增、删、改操作时&#xff0c;有时会出现执行sql异常的情况。在批量提交数据的时候&#xff0c;如果其中一个事务提交错误&#xff0c;往往导致预期的整个数据链不完整。 例如银行转账数据&#xff0c;用户A向用户B转账&#xff1a; …

blast安装及简单使用

一、安装blast 1.Ubuntu环境 # 下载blast wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/2.9.0/ncbi-blast-2.9.0-x64-linux.tar.gz # 解压blast压缩包 tar -xzvf ncbi-blast-2.9.0-x64-linux.tar.gz # 测试 ./bin/blastp -h 这里就代表安装成功了&#xff0c;…

Mac电脑上设置一位数密码

1. 打开“终端”应用程序&#xff0c;你可以在 “ 应用程序 ” 文件夹中找到它。 2. 在终端窗口中&#xff0c;输入以下命令并按下回车键 pwpolicy -clearaccountpolicies 这个命令的目的是清除全局账户策略&#xff0c;允许设置较低位数的密码。 3. 输入你的开机密码并按下…

springCould-从小白开始【1】

目录 1.说明 2.父工程 3.服务端 4.消费者 5.公共模块 6.RestTemplate 1.说明❤️❤️❤️ 创建三个模块&#xff0c;服务者&#xff0c;消费者&#xff0c;公共api 注&#xff1a;spring boot和spring cloud有版本约束 2.父工程 ❤️❤️❤️ 约定版本号配置 注意&…

GSCoolink GSV1201E Type C/DP1.2转HDM1.4

DisplayPort 1.2 to HDMI 1.4 Converter with Embedded MCU 功能特征 1、GSV1201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.2 to HDMI 1.4转换器。 2、显示接口接收器支持21.6Gbps(HBR2&#xff0c;4-lane)。 3、HDMI发射器支持9Gbps(TMDS3G3Lane)。…

OpenHarmony南向之TP触摸屏

概述 Touchscreen驱动用于驱动触摸屏使其正常工作&#xff0c;该驱动主要完成如下工作&#xff1a;对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口&#xff08;I2C或SPI&#xff09;、设定Input相关配置、下载及更新固件等操作。 Touchscreen驱…

mysql:查看线程缓存中的线程数量

使用命令show global status like Threads_cached;可以查看线程缓存中的线程数量。 例如&#xff0c;查询线程缓存中的线程数量如下&#xff1a; 然后启动应用程序&#xff0c;使用连接&#xff0c;查询如下&#xff1a; 由查询结果可以看到&#xff0c;线程缓存中的线程数量…

人工智能时代,看好硅光子!

硅光子学是一种用于制备光子集成电路&#xff08;PIC&#xff09;的技术&#xff0c;通常用于产生、检测、传输和处理光。这种方法使用半导体绝缘体上硅&#xff08;SOI&#xff09;晶片作为衬底材料&#xff0c;并采用标准的互补金属氧化物半导体&#xff08;CMOS&#xff09;…

弧形导轨的类型及应用

弧形导轨又叫圆弧形导轨&#xff0c;滚轮弧形导轨&#xff0c;是通过V型滚轮在圆弧形V型导轨面上的滚动&#xff0c;实现圆周运动&#xff1b;在工业自动化中&#xff0c;有些应用需要弧线运动&#xff0c;或者两个相交或平行的直线运动&#xff0c;这些情况需要通过弧线运动连…

netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”

今天学C#遇到一个问题记录下 创建如上所示的项目后运行出错&#xff1a; netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”。运行 nuget 包还原以生成此文件。 consoleapp1 c:\program files\dotnet\sdk\8.0.100\sdks\microsoft.net…

pyCharm 创建一个FastApi web项目,实现接口调用

FastApi和Django区别 我这边演示项目使用的fastApi作为web框架&#xff0c;当然主流一般都是使用Django做web框架&#xff0c;但是Django是一个重量级web框架他有很多组件&#xff0c;如授权&#xff0c;分流等全套web功能。我这边呢只需要有个接口可以被别人调用&#xff0c;…

脉冲水表和光电直读水表有什么区别?

脉冲水表和光电直读水表是两种常见的水表类型&#xff0c;它们在原理和功能上有着一些明显的区别。在本文中&#xff0c;我们将探讨脉冲水表和光电直读水表的区别&#xff0c;并讨论它们各自的优势和适用场景。 首先&#xff0c;我们来看看脉冲水表。脉冲水表是一种机械式水表&…

Python列表操作详解,多种方式删除首元素

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;处理列表的操作是日常开发中不可避免的任务之一。其中&#xff0c;删除列表中的元素是一个常见的需求&#xff0c;而删除第一个元素更是一个特殊的场景。本篇博客将详细介绍Python中多种方…

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…

3D可视化大屏:赋能行业数据可视化应用,让数据更鲜活

互联网时代&#xff0c;各种数据信息充斥在我们的生活中&#xff0c;对于大量的数据&#xff0c;我们也需要大量的时间才能去分析理解&#xff0c;因此3D可视化大屏的展示无疑是令人兴奋的进步。3D数据大屏能够将数据以更加直观、更加生动的方式呈现出来&#xff0c;结合VR全景…