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

ops/2024/9/23 14:24:40/

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

设计思想:双指针操作
变量说明
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.ppmy.cn/ops/11819.html

相关文章

linux的一些实用操作

快捷键 强制停止 ctrlc强制停止或退出命令的输入 退出登出 ctrld强制退出用户登录或退出某些程序的专属页面&#xff08;如py&#xff09; ps&#xff1a;不能退出vi/vim 历史命令搜索 history可以查看历史命令&#xff0c;用来复制粘贴 在使用history之后&#xff0c;…

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动&#xff0c;不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1&#xff1a;加入Discord 访问Midj…

C#开发UdpClient无法在局域网中发送UDP广播包,但能接收的解决办法

# 记得开发好的软件原来可以使用的&#xff0c;今天突然不正常了&#xff0c;还以为哪里修改过了。 在网上看到了一个网友的文章&#xff1a;https://www.cnblogs.com/kissazi2/archive/2012/12/07/2806533.html 我虽然没有安装虚拟机&#xff0c;没有VMware的虚拟网卡&#…

西瓜书学习——对数几率回归

对数几率回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的统计方法&#xff0c;特别是用于二分类问题。尽管它的名字中包含“回归”&#xff0c;但它实际上是一种分类算法&#xff0c;用于估计一个样本属于某个类别的概率。 对数几率回归的核心是使…

C++ day1

const char *p; 可以改变p的值&#xff0c;不可以改变p指向的字符的值。 const (char *) p; 语法错误 char *const p; 可以改变p指向的字符值 不可以改变p的值 const char* const p; 都不可以改变 char const *p; 可以改变p的值 不可以改变 p指向的字符的值 …

CUDA 以及MPI并行矩阵乘连接服务器运算vscode配置

一、CUDA Vscode配置 &#xff08;一&#xff09;扩展安装 本地安装 服务器端安装 &#xff08;二&#xff09; CUDA 配置 .vscode c_cpp_properties.json {"configurations": [{"name": "Linux","includePath": ["${workspa…

共商共建共享是“一带一路”建设的重要指导原则。其中,“共享”是指实现(),充分调动各方面积极性。

共商共建共享是“一带一路”建设的重要指导原则。其中&#xff0c;“共享”是指实现()&#xff0c;充分调动各方面积极性。 请点击查看答案 A.均衡发展B.优势互补 C.平等互惠D.互利共嬴 “一带一路”是繁荣之路。推进“一带一路”建设要深入开展产业合作&#xff0c;推动各国…

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c++推理

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c++推理 文章目录 阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c++推理简介环境部署下载源码安装环境下载模型测试一下看看效果模型转onnx测试一下生成的onnx模型看看效果C++ 推理简介 DDCo…