学习笔记-数据结构-线性表(2024-04-16)

设计一个算法判断单链表中元素是否是递增的。

设计思想:双指针操作
变量说明
head表示链表头指针
pq表示两个用来遍历链表的指针节点,且q始终在p之后

bool IsIncrease(LinkList *head)
{
	// 代码优先判空,若为空链表,或者只有一个节点,一定是递增的
	if(head==NULL || head->next==NULL)
	{
		return true;
	}
	// 使用两个指针p和q遍历链表,p始终在q前面一个节点
	for(p=head,q=head->next;q!=NULL;p=q,q=q->next)
	{
		// 比较当前节点p和下一个节点q的值
		if(p->data > q->data)
		{
			// 如果当前节点p的值大于下一个节点q的值,则链表不是递增的
			return false;
		}
	}
	return true;
}

重点代码详细说明
bool IsIncrease(LinkList *head)
IsIncrease是函数名,表示这个函数的目标是判断一个链表的排序顺序是否是非递减(即递增或相等)的。
LinkList是自定义的数据类型,通常表示一个链表节点的结构。在这里,它表示链表中的每个元素。
*head是一个指针,指向链表的第一个节点,也就是链表的头节点。它是函数的输入参数,提供了链表的起点。
在算法中,head是遍历的起始点,用于访问链表中的数据。
for(p=head,q=head->next;q!=NULL;p=q,q=q->next)
for循环用来遍历链表中的每个节点。
p是一个遍历指针,初始化为指向头节点head,这个变量在每次循环中表示当前节点。
q是p后面的节点,它总是指向p的下一个节点,初始化为head->next。
q!=NULL是循环的继续条件,只要q不是空指针,循环就会继续,意味着链表还没有遍历完。
这里p和q的命名相对简短,但可以命名为current和next以提高代码的可读性。
if(p->data > q->data)
p->data和q->data是链表节点中的数据字段。
这行代码比较了当前节点p和下一个节点q的值。
如果p节点的值大于q节点的值,这违反了递增的定义。

设计一个算法将所有奇数移到所有偶数之前。

设计思想:双指针操作
变量说明
a[] 表示一个整型数组,待处理的数据组
start表示一个指针,数组将被处理的起始位下标
end表示一个指针,数组将被处理的结束位下标
start~end是表示数组将被遍历的范围
temp 临时变量用于存储数组元素
(为了不让你把这里的指针和C语言里的指针搞混,下面注释统一叫做指向标)

void quick_move(int a[],int start,int end)
{
	int temp;
	// 外层循环,确保start指针在end指针左侧,用于控制整个数组的遍历范围
	while(start < end)
	{
		// 从数组的末尾向前移动end指向标直至找到一个奇数
		while(end>=0 && a[end]%2==0)
		{
			end--; // 向前移动end指向标
		}
		// 从数组的起始位置向后移动start指向标直至找到一个偶数
		while(start < end && a[start]%2!=0)
		{
			start++; // 向后移动start指向标
		}
		// 如果start仍然在end的左侧,意味着找到了一对需要交换的奇数和偶数,并进行交换
		if(start<end) 
		{
			temp=a[start];
			a[start]=a[end];
			a[end]=temp;
		}
	}
}

设计一个最优的算法实现输出链表中倒数第k个节点,定义链表结构如下:

struct ListNode
{
	int value;
	ListNode * next;
}

代码思想:双指针操作(快慢指针),利用p、q两个指针实现,p先走k-1步,然后p和q再同时出发,当p指向最后一个节点时,正好q指向了链表中倒数第k个节点。

ListNode * FindKthToTail(ListNode *head,int k)
{
	// 声明并初始化两个用于遍历链表的指针
	ListNode *p,*q;
	p=head;
	q=head;
	// 循环,目的是将p移动到正向数第k个节点的位置
	for(i=1;i<k;i++)
	{
		if(p==NULL) return NULL; // 如果p节点为空了,说明链表长度根本没到k,直接返回NULL
		p=p->next;
	}
	// 持续遍历直到p指向成最后一个节点
	while(p->next)
	{
		// p q 两个指针都向下一个节点移动
		p=p->next;
		q=q->next;
	}
	return q;
}

这段代码核心的部分是基于一个快慢指针的策略来确定链表中的倒数第k个节点。重点代码主要分为两个部分:
快指针p的初始化移动

for(int i=1; i<k; i++)
{
   if(p==NULL) return NULL;
   p = p->next;
}

在这个循环中,我们首先检查p是否为NULL。这是一个关键的边界条件检查:如果p已经是NULL,这表明链表中的节点数少于k,因此不存在倒数第k个节点,此时函数应当返回NULL
如果p不是NULL,p将沿着链表移动,直到它完成了k-1次移动。这意味着快指针p现在比慢指针q(仍然指向头节点)前进了k-1个节点。这样一来,指针p和指针q之间就正好相隔k个节点(包括p所指向的节点)。
快指针p和慢指针q的同步移动

while(p->next)
{
   p = p->next;
   q = q->next;
}

在这个循环中,只要快指针p的下一个节点不是NULL(这意味着p不是指向最后一个节点),快慢指针就会同步向前移动。
每当快指针p移动到下一个节点,慢指针q也跟随移动到它的下一个节点。因为快慢指针之间始终保持k-1个节点的距离,所以当快指针p到达链表的末尾时(p->nextNULL),慢指针q正好指向倒数第k个节点。
最后,当快指针p到达链表的末尾时,慢指针q所指向的节点就是我们要找的倒数第k个节点,此时返回q即可。
需要注意,这个算法假设k的值是有效的,即1 <= k <= 链表长度。如果k小于1或者大于链表的长度,算法的行为将是未定义的。在实际应用中,应该首先检查k的有效性。

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

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

相关文章

HarmonyOS Next 悬浮窗拖拽和吸附动画

介绍 本示例使用position绝对定位实现应用内悬浮窗&#xff0c;并且通过animateTo结合curves动画曲线实现悬浮窗拖拽跟手和松手吸附边缘的弹性动画效果。 效果图预览 使用说明 按住悬浮窗可以拖拽&#xff0c;松开后悬浮窗自动靠左或靠右&#xff0c;如果悬浮窗超出内容区上…

线圈、寄存器、存储区代号、功能码 案例说明

线圈和寄存器 表示数据类型 线圈&#xff1a;表示Boolean数据类型 寄存器&#xff1a;表示非Boolean数据类型&#xff0c;用来暂时存放参与运算的数据和运算结果&#xff0c;具有接收数据、存放数据和输出数据的功能。 ModbusRTU 读输出线圈 存储区代号 0区 功能码 0x01 读输入…

冯喜运:4.17晚间黄金原油操作建议

【黄金消息面解析 】&#xff1a;周三(4月17日)欧洲时段&#xff0c;现货黄金短线持续反弹&#xff0c;当前金价位于2394美元/盎司附近&#xff0c;已从日内低点2372美元/盎司附近回升。金价在触及纪录高位2432美元/盎司后形成了对称三角形。金价下一个潜在障碍为历史高位2432美…

JS/TS笔记学习1

周末总得学点什么吧~ 奥利给! 跑火车 递归 减速 let currentIndex 0; let speed 500; // 初始速度&#xff0c;单位是毫秒 let decrement 20; // 每次迭代速度减少的量 const cells document.querySelectorAll(.cell); function highlightCell() { cells.forEach(…

14_SpringMVC

文章目录 MVCSpringMVC与JavaEE对比SpringMVCSpringMVC的核心流程SpringMVC入门案例RequestMapping注解的使用Handler方法的返回值Handler方法的形参keyvalue形式的请求参数Json请求参数 RESTful风格接口静态资源处理FilterHandlerInterceptor异常处理SpringMVC核心流程流程图 …

界面设计【1】-项目的UI设计css

引言&#xff1a; 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中&#xff0c;CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表&#xff08;Cascading S…

一篇写给前端的精选面试题,中大厂面试重复率高到爆!!!

写在前面 针对前端环境恶劣&#xff0c;很多人在前端面试的时候都直接去找相关公司的面经&#xff0c;或者没有真正新一点各个厂里常用面试题&#xff0c;现在小编给大家整理好了&#xff0c;前端面试无非就是那些&#xff0c;面试题更别谈新旧&#xff0c;只不过很多公司常用…

L2-024. 部落-PAT团体程序设计天梯赛GPLT(tarjan缩点)

题解&#xff1a; 可能有人在多个圈子&#xff0c;那么这几个圈子合并为一个部落&#xff0c;一个做法就是将圈子转化为有向图&#xff0c;最后求出的缩点就是部落个数。再查询是否在一个缩点当中。 #include<bits/stdc.h> #pragma GCC optimize("Ofast") #d…

BackTrader 中文文档(十二)

原文&#xff1a;www.backtrader.com/ Visual Chart 原文&#xff1a;www.backtrader.com/docu/live/vc/vc/ 与 Visual Chart 的集成支持两者&#xff1a; 实时数据提供 实时交易 Visual Chart是完整的交易解决方案&#xff1a; 在单个平台上集成图表、数据源和经纪功能 更多…

【在线OJ系统】自定义注解实现自增ID的无感插入

实现思路 首先自定义参数注解&#xff0c;然后根据AOP思想&#xff0c;找到该注解作用的切点&#xff0c;也就是mapper层对于mapper层的接口在执行前都会执行该aop操作&#xff1a;获取到对于的方法对象&#xff0c;根据方法对象获取参数列表&#xff0c;根据参数列表判断某个…

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解 目录 时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解&#xff08;完整源码和数据) 1.利用鲸…

Semaphore信号量源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是Semaphore&#xff1f; 3. Semaphore源码解读 3.1 acquire…

Linux系统的引导过程与服务控制

目录 一、Linux操作系统引导过程 二、Linux系统服务控制 系统初始化进程 三、运行级别切换 *运行级别及切换 Linux系统的运行级别 四、优化开机自动加载服务 五、修复MBR扇区故障 一、Linux操作系统引导过程 主要步骤 开机自检&#xff1a; 检测硬件设备&#…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…

小米汽车SU7隐藏款曝光!新配色和透明车身亮了 coreldraw教程入门零基础 coreldraw下载 coreldraw2024

刘强东说&#xff0c;论营销&#xff0c;没有任何人能比得过小米。 小米SU7发布会24小时&#xff0c;下定量就超过了蔚来汽车2023年四季度的交付量。 ▲雷军发布的小米SU7 24小时订单量 小米SU7发布会后五天&#xff0c;雷军在北京亦庄工厂亲自交付了第一批创世版本小米SU7&a…

黑马点评(四) -- 分布式锁

1 . 分布式锁基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让…

gpt4.0人工智能网页版

在最新的AI基准测试中&#xff0c;OpenAI几天前刚刚发布的GPT-4-Turbo-2024-04-09版本&#xff0c;大幅超越了Claude3 Opus&#xff0c;重新夺回了全球第一的AI王座。 GPT-4-Turbo-2024-04-09版本是目前国内外最强的大模型&#xff0c;官网需要20美元每月才能使用&#xff0c;…

【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;2&#xff09;查询&#xff09;基础上继续实现以表格形式显示查询到的数据的功能 效果 步骤 1. 在“WBP_Query”中将多行文本框替换未网格面板控件&#xff0c;该控件可以用表格形式布局…

Pytest测试用例中的mark用法(包含代码示例与使用场景详解)

在软件开发中&#xff0c;测试是确保代码质量和功能稳定性的重要环节。Python作为一门流行的编程语言&#xff0c;拥有丰富的测试工具和框架&#xff0c;其中pytest是其中之一。pytest提供了丰富的功能来简化测试用例的编写&#xff0c;其中的mark功能允许我们对测试用例进行标…

理解思维链Chain of Thought(CoT)

Chain of Thought&#xff08;CoT&#xff09;&#xff0c;即“思维链”&#xff0c;是人工智能领域中的一个概念&#xff0c;特别是在自然语言处理和推理任务中。它指的是一种推理过程&#xff0c;其中模型在生成最终答案之前&#xff0c;先逐步推导出一系列的中间步骤或子目标…
最新文章