删除单向链表中数据最小的结点

news/2024/10/2 14:21:19

(1)算法的基本设计思想

要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:

  1. 定义4个指针,分别命名为MinNodeprevMinNodeCurrentNodePrevCurrentNodeMinNodeprevCurrentNodePrev指向链表的头结点,MinNodeCurrentNode指向链表的首结点。
  2. 同时移动CurrentNodePrevCurrentNode指针,直到CurrentNodePrev指针到达链表的末尾(即CurrentNodePrev->next指针指向NULL),在移动的同时,判断MinNode->data是否大于CurrentNode->data,条件成立则记录当前结点和直接前驱结点。
  3. 此时,MinNode就是最小值结点。

这个算法的关键在于使用了4指针,这个算法的时间复杂度是O(n),其中n是链表的长度。因为我们只需要遍历一次链表就可以找到最小值结点。

(2)C语言实现代码

/***************************************************************************** * function name     : LList_FindReciprocalK* function          : 设计一个算法删除单链表L(有头结点)中的一个最小值结点。* parameter         : *                      @Head: 链表的头指针。* * return value      : 失败返回false,成功返回true。* note              : None* author            : crazy3min@outlook.com* date              : 2024-04-22* version           : V1.0* revision history  : None* 
****************************************************************************/
bool LList_MinDel(LList_t *Head)
{//1.判断链表是否为空,如果为空,退出if (NULL == Head->next){printf("LList_MinDel fail, linkedlist is Empty\n");return false;}//2.开始寻找最小值 LList_t *MinNodeprev =  Head;   //定义一个变量保存最小值的节点地址的直接前驱LList_t *MinNode = Head->next;   //定义一个变量保存最小值的节点地址,初始化为首节点LList_t *CurrentNodePrev = Head;     //定义一个变量保存当前节点的直接前驱LList_t *CurrentNode = Head->next;   //定义一个变量保存当前节点,初始化为首节点//开始遍历循环while (CurrentNode)  //非零即真,NULL时退出循环,即所有节点数据遍历后退出{if (MinNode->data > CurrentNode->data)  // 最小值节点data大于当前节点data,成立则进入循环体,链表只有一个首节点也能删除。{MinNodeprev = CurrentNodePrev; //记录当前最小值节点的前驱节点MinNode = CurrentNode;         //记录当前最小值节点}//不管if条件是否成立,都需要做节点偏移,这样才能遍历节点的所有数据CurrentNodePrev = CurrentNode;CurrentNode = CurrentNode->next;}//3.while循环后,已经找到最小值节点,连接后删除原有节点即可。printf("MinNode had delete, the value is [%d]\n", MinNode->data);MinNodeprev->next = MinNode->next;  //将最小值节点的直接前驱 连接 最小值节点的直接后继MinNode->next = NULL;            //将最小值节点的指针域指向NULLfree(MinNode);                   //释放最小值节点return true;}

验证

crazy3min_图片

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

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

相关文章

Java-线程-线程池

0.背景参考资料:Java线程池实现原理及其在美团业务中的实践在 Java 早期,每次创建线程时,都要涉及到线程的创建、销毁以及资源管理,这对于系统的性能和资源利用率是一种浪费。 因此,Java 提供了线程池的概念,以提高线程的管理效率和性能。资源管理优化:传统的线程创建和…

8.2版本Web端移动开发调试强制跳转新移动框架

解决方案: Common.config文件中增加配置项 <add key="MobileLoginType" value="1" /> 如下图其他注意事项: 没有配置MobileLoginType属性 或 MobileLoginType = "" 或 MobileLoginType = 2 都会执行重定向 MobileLoginType = 3 系…

Error: Cannot find module ‘D:\SoftSetupLoaction\nodejs\node_global\node_modules\npm\bin\npm-cli.js‘

Error: Cannot find module ‘D:\SoftSetupLoaction\nodejs\node_global\node_modules\npm\bin\npm-cli.js‘ 出现原因: 重新安装可装了nodejs和npm 网上查了很多方法,都建议重装,但是都没有效果(因为我就是重装之后出现的问题) 按照错误提示node_global找不到npm-cli.js,个人…

初探pinctrl子系统和GPIO子系统

前言: 在前面的led驱动程序和按键驱动程序中,无论是最传统的方法,还是总线设备驱动模型,还是基于设备树的总线设备驱动模型,都是直接操作寄存器的方法。驱动开发的本质确实是操作寄存器,但是一个芯片有几百个引脚,只是操作少数的几个引脚还好,如果是大量的引脚,比如LC…

PVE新增硬盘并扩容给 local分区

PVE安装在120G的固态硬盘,现在加了一块1T的机械硬盘作为虚拟机系统用,需要把磁盘扩容给 local分区 1、ssh连上pve,使用 lsblk 查看硬盘驱动器路径,我这里新加的硬盘是 sda,硬盘还未进行分区 2、fdisk /dev/sda,对硬盘进行分区操作,注意你自己的硬盘名称,千万小心不要搞…

《最新出炉》系列入门篇-Python+Playwright自动化测试-45-鼠标操作-下篇

1.简介 鼠标为我们使用电脑提供了很多方便,我们看到的东西就可以将鼠标移动过去进行点击就可以打开或者访问内容,当页面内容过长时,我们也可以使用鼠标滚轮来实现对整个页面内容的查看,其实playwright也有鼠标操作的方法。上一篇文章中已经讲解过鼠标的部分操作了,今天宏哥…

redux中核心组件有哪些,reducer的作用

在redux中,核心组件包括Action、Reducer、Store和Middleware。 Action是一个普通的JavaScript对象,用于描述发生了什么事件。它必须包含一个type属性,用于标识事件的类型。可以在Action中添加其他自定义的属性来传递数据。 Reducer是一个纯函数,用于根据收到的Action来更新…

学习记录+vcode+GPIO例程+正点原子 DNESP32S3 开发板教程-IDF 版

第一个程序: UART模式和JTAG模式,配置完成不同。配置主要就是.vscode 文件夹中 c_cpp_properties.json,tasks.json,launch.json,settings.json四个文件。 一个想法:备份UART模式和JTAG模式的配置文件,用时直接文件替换。简单粗暴方式是.vscode 文件夹替换。当然每次要选…