学习笔记-数据结构-线性表(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,直接返回NULLp=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.mzph.cn/diannao/2372.shtml

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

相关文章

开源大模型王者归来:llama3最大4000亿参数,性能GPT4相当,超越Grok3140亿且全开源代码

llama3&Grok 目前开源的超级大模型有Gork和Llama3 https://github.com/xai-org/grok-1&#xff1b;该模型称为史上最大开源LLM&#xff0c;参数高达3140亿&#xff01;马斯克如约开源Grok&#xff0c;10小时狂揽10000颗Star&#xff0c;搞笑的是这个模型只开源了推理没有训…

17.Nacos与Eureka区别

Nacos会将服务的提供者分为临时实例和非临时实例。默认为临时实例。 临时实例跟eureka一样&#xff0c;会向注册中心报告心跳监测自己是否还活着。如果不正常了nacos会剔除临时实例。&#xff08;捡来的孩子&#xff09; 非临时实例&#xff0c;nacos会主动询问服务提供者是否…

古董展新风尚:山海鲸数据大屏引领科技潮流

在数字化浪潮的推动下&#xff0c;传统文化与现代科技正日益融合&#xff0c;展现出独特的魅力。近日&#xff0c;山海鲸推出了一款古董展览数据可视化大屏&#xff0c;将古董藏品的丰富内涵以直观、生动的形式呈现在观众面前&#xff0c;让人们在欣赏古董之美的同时&#xff0…

Crash Course Computer Science

计算机速成课个人理解概要 1.计算机的本质 计算机的本质&#xff1a;极其简单的组件&#xff0c;经过一层层复杂的抽象&#xff0c;做出复杂的工作 2.控制电流的技术发展 继电器→真空管→晶体管 拥有了细微控制电流的手段 tip:早期机械计算机&#xff0c;被虫子(bug)卡住…

深入探索GDB:Linux下强大的调试神器

目录 一、GDB简介&#xff1a;源码级调试的基石 二、GDB基础操作&#xff1a;从入门到熟练 启动与基本命令 三、GDB进阶功能&#xff1a;解锁更深层次的调试能力 1. 回溯追踪&#xff1a;洞察调用栈 2. 动态内存检测&#xff1a;揪出内存问题 3. 条件断点与观察点&#…

制氢机远程监控运维方案

制氢机远程监控运维方案 在当今能源转型的大背景下&#xff0c;氢能作为清洁、高效且可再生的能源载体&#xff0c;其重要性日益凸显。而制氢机作为氢能产业链中的关键设备&#xff0c;其稳定运行与高效运维对于保障氢气供应、推动氢能产业健康发展至关重要。在此背景下&#…

基于Linux系统命令行安装KingbaseES数据库

人大金仓通用性数据库&#xff08;Kingbase&#xff09;下载网址&#xff1a;人大金仓-成为世界卓越的数据库产品与服务提供商 选择“软件版本-数据库”&#xff0c;筛选条件Linux、完整版。找到需要的版本&#xff0c;点击下载。我下载的是KingbaseES_V008R006C008B0014_Lin6…

Java中空指针异常

在Java中&#xff0c;大家对于空指针异常&#xff08;NullPointerException&#xff09;应该都不陌生&#xff0c;它是由于我们尝试调用了一个空引用的方法或访问其属性所产生的。下面是几个常见的原因&#xff1a; 1.在对象实例上调用方法&#xff0c;但在运行时对象为null。…

解决jupyter中使用keplergl的visualization_data函数不显示图片的问题

解决jupyter中使用keplergl的visualization_data函数不显示图片的问题 运行下面的命令&#xff1a;. 首先确认已经安装keplergl pip install keplergl然后运行下面两条命令&#xff1a; jupyter nbextension install --py --sys-prefix keplergl jupyter nbextension enabl…

实现Spring底层机制(二)

文章目录 阶段2—封装bean定义信息到Map1.代码框架图2.代码实现1.文件目录2.新增注解Scope存储单例或多例信息Scope.java3.修改MonsterService.java指定多例注解4.新增bean定义对象存储bean定义信息BeanDefinition.java5.修改pom.xml增加依赖6.修改容器实现bean定义信息扫描Sun…

nginx开启basic认证

basic认证也叫做http基本认证&#xff0c;防止恶意访问 首先用在线网站生成一个叫做htpasswd的账号密码文件。 将生成结果复制到/etc/nginx/htpasswd文件中 在server的location中配置 server { listen 80; server_name a.com;location / { root html;index index.…

springcloud alibaba 整合seata的TCC

一、seata服务端搭建同上篇。 Seata的AT模式客户端两阶段提交流程源码分析 二、seata客户端的结构 1.示例DEMO工程 下单&#xff0c;扣余额&#xff0c; 减库存。 2. MAVEN配置。 父工程&#xff1a;由于spring-cloud-starter-alibaba-seata依赖的seata-spring-boot-starter…

顺序栈着三种结构定义及其初始化

定义 顺序堆栈这三种结构定义及其初始化 - 知乎 (zhihu.com) 根据以上链接得到&#xff1a; 1.理解为数组&#xff0c;top是这个数组的索引值&#xff1b;定义这个结构体类型时&#xff0c;系统不分配空间 在主函数声明时&#xff0c;定义了关于这个结构体的变量&#xff0c…

Java 【数据结构】 二叉树(Binary_Tree)【神装】

登神长阶 第五神装 二叉树 Binary-Tree 目录 &#x1f3b7;一.树形结构 &#x1fa97;1.概念 &#x1f3b8;2.具体应用 &#x1f3b9; 二.二叉树&#xff08;Binary Tree&#xff09; &#x1f3ba;1.概念 &#x1f3bb;2.表现形式 &#x1fa95;3.特殊类型 &#x1f941…

自己手动在Linux上实现一个简易的端口扫描器

背景 常常听到网络攻击有一个东西叫做端口扫描器&#xff0c;可以扫描指定服务器开放的端口&#xff0c;然后尝试连接&#xff0c;并寻找漏洞&#xff0c;最终攻破服务器。而那些使用的端口扫描器都是一个个现成的程序&#xff0c;看上去很厉害的样子。而实际上这些东西对于懂…

【前端技术】HTML基础入门篇

1.1 HTML简介 ​ HTML&#xff08;HyperText Markup Language&#xff1a;超文本标记语言&#xff09;是一种标识性的语言。它包括一系列标签&#xff0e;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组…

投资网站汇总

1、 中信证券(600030)历年财务指标——亿牛网https://eniu.com/gu/sh600030/cwzb 2、 3、 4、

上海计算机学会2022年11月月赛C++丙组T3最长平台

题目描述 给定一个整数数列 a1​,a2​,…,an​&#xff0c;请找出最长平台。所谓平台&#xff0c;就是指数列中一段连续的、完全相等的数字&#xff0c;单个数字也可以成为一个平台。最长平台可能不止一个&#xff0c;在找到最长平台的同时&#xff0c;输出最长平台的数量。 …

每日一题 —— 最大子数组之和(动态规划)

1.链接 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 4.参考代码 class Solution { public:int maxSubArray(vector<int>& nums) {int n nums.size();vector<int> dp(n1,0);int ret INT_MIN;for(int i 1;i<n;i){dp[i] ma…

跟着野火从零开始手搓FreeRTOS(6)多优先级的配置

在 FreeRTOS 中&#xff0c;数字优先级越小&#xff0c;逻辑优先级也越小。 之前提过&#xff0c;就绪列表其实就是一个数组&#xff0c; 里面存的是就绪任务的TCB&#xff08;准确来说是 TCB 里面的 xStateListItem 节点&#xff09;&#xff0c;数组的下标对应任务的优先级&a…