当前位置: 首页 > news >正文

嵌入式数据结构笔记三——单向链表Ⅲ

文章目录

  • 前言
  • 一、查找链表中间节点:
  • 二、查找链表倒数第k个节点:
  • 三、不知道头结点地址删除链表中间节点:
  • 四、链表的倒置:
  • 五、链表的排序:
    • 1.冒泡排序:
    • 2.选择排序:
  • 六、判断链表是否有环:
  • 七、Makefile:
  • 重点


前言

前文学习了关于单向链表的基本操作,包括定义,创建,销毁和增删改查。本文将进一步学习关于单向链表的排序,倒置以及判断链表是否有环等相关问题。


正文内容:

一、查找链表中间节点:

在这里插入图片描述

  • 快指针每次走2步,慢指针每次都1步
  • 快指针走到末尾,慢指针走到中间
/* 查找链表中间节点 */
linknode *find_midnode(linknode *phead)
{linknode *pslow = NULL;linknode *pfast = NULL;pslow = pfast = phead->pnext;while (pfast != NULL){pfast = pfast->pnext;if (NULL == pfast){break;}pfast = pfast->pnext;if (NULL == pfast){break;}pslow = pslow->pnext;}return pslow;
}

二、查找链表倒数第k个节点:

在这里插入图片描述

  • 快指针先走k步
  • 慢指针和快指针每次走一步
  • 快指针到达末尾,慢指针少走k步,即倒数第k个元素
/* 查找链表倒数第k个节点 */
linknode *find_last_kth_node(linknode *phead, int k)
{linknode *pfast = NULL;linknode *pslow = NULL;pfast = phead->pnext;pslow = phead->pnext;int i = 0;for (i = 0; i < k; i++){if(NULL == pfast){return NULL;}pfast = pfast->pnext;}while (pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;
}

三、不知道头结点地址删除链表中间节点:

在这里插入图片描述

  • 将指针指向的下一个节点的值覆盖当前节点的值
  • 删除下一个节点
/* 删除指定节点 */
int delete_linknode(linknode *ptmpnode)
{linknode *pnextnode = NULL;pnextnode = ptmpnode->pnext;ptmpnode->data = pnextnode->data;ptmpnode->pnext = pnextnode->pnext;free(pnextnode);pnextnode = NULL;	//局部变量也可以不赋return 0;
}

四、链表的倒置:

在这里插入图片描述
将链表中的所有元素倒置

  • 将原链表断开
  • 将所有的元素依次使用头插法插入
/* 链表倒置 */
int reverse_linklist(linknode *phead)
{linknode *pinsertnode = NULL;linknode *ptmpnode = NULL;//将链表从头结点处断开ptmpnode = phead->pnext;phead->pnext = NULL;//依次将所有元素使用头插法插入链表中while (ptmpnode != NULL){pinsertnode = ptmpnode;ptmpnode = ptmpnode->pnext;pinsertnode->pnext = phead->pnext;phead->pnext = pinsertnode;//如果写成pinsertnode->pnext = NULL;则在第二次循环时会断掉}return 0;
}

五、链表的排序:

1.冒泡排序:

在这里插入图片描述

  • 采用冒泡排序思想,定义两个指针,相邻两个元素比较
  • 指针循环向后走,直到ptmpnode2为NULL,即等于pend,循环停止
  • pend赋值为tmpnode1的节点地址
  • 下一轮就可以少比1次
  • 循环将所有大的元素找到,剩余一个小的元素即可
/* 链表的冒泡排序 */
int bubble_sort_linklist(linknode *phead)
{linknode *ptmpnode1 = NULL;linknode *ptmpnode2 = NULL;linknode *pend = NULL;datatype tmpdata;if (NULL == phead->pnext || NULL == phead->pnext->pnext ){return 0;}while (1){ptmpnode1 = phead->pnext;ptmpnode2 = phead->pnext->pnext;if (pend == ptmpnode2)	//如果ptmpnode2和pend的起始位置一致就无须再比了{break;}while (ptmpnode2 != pend){if (ptmpnode1->data > ptmpnode2->data){tmpdata = ptmpnode1->data;ptmpnode1->data = ptmpnode2->data;ptmpnode2->data = tmpdata;}ptmpnode1 = ptmpnode1->pnext;ptmpnode2 = ptmpnode2->pnext;}pend = ptmpnode1;}return 0;
}

2.选择排序:

在这里插入图片描述

  • pswapnode指向要交换的节点
  • pminnode假设的最小值
  • ptmpnode和后续节点比较
/* 链表的选择排序 */
int select_sort_linklist(linknode *phead)
{linknode *pswapnode = NULL;linknode *ptmpnode = NULL;linknode *pminnode = NULL;datatype tmpdata;if (NULL == phead->pnext || NULL == phead->pnext->pnext){return 0;}pswapnode = phead->pnext;while (pswapnode->pnext != NULL){pminnode = pswapnode;ptmpnode = pswapnode->pnext;while (ptmpnode != NULL){if (ptmpnode->data < pminnode->data){pminnode = ptmpnode;}ptmpnode = ptmpnode->pnext;}if (pswapnode != pminnode){tmpdata = pswapnode->data;pswapnode->data = pminnode->data;pminnode->data = tmpdata;}pswapnode = pswapnode->pnext;}return 0;
}

六、判断链表是否有环:

在这里插入图片描述

  • 链表是否有环:
    • 定义两个指针:快指针(每次走2步)和慢指针(每次走1步)
    • 快指针 - 慢指针 == 环长 即相遇,快指针和慢指针相等即为链表有环
  • 计算环长:
    • 定义一个指针从环相遇点开始走一圈,直到走到该节点为止
    • 每走一个节点计数,最终可得到环长
  • 获得环的入口位置:
    • 需要公式推导:
      x:起始点到环入口的距离
      y:环入口到相遇点的距离
      z:相遇点到环入口的距离
      pslow:x + y
      pfast: x + y + n (y + z)
      2 * (x + y) = x + y + n (y + z)
      x + y = n (y + z)
      x = n (y + z) - y
      x= (n - 1) (y + z) + z——>当 n = 1 时 x = z
    • 定义一个指针从相遇点开始每次走一步,定义一个指针从开头每次走一步
    • 两个指针相遇的位置即为环入口位置
/* 1.判断链表是否有环2.计算环长3.找到环的入口位置
*/
int circle_linklist(linknode *phead, int *pis_circle, int *pcirlen, linknode
**ppnode)
{linknode *pfast = NULL;linknode *pslow = NULL;linknode *ptmpnode = NULL;linknode *pstartnode = NULL;/* 判断是否有环 */pfast = phead->pnext;pslow = phead->pnext;while (1){pfast = pfast->pnext;if (NULL == pfast){break;}pfast = pfast->pnext;if (NULL == pfast){break;}pslow = pslow->pnext;if (pfast == pslow){break;}}if (NULL == pfast){*pis_circle = 0;return 0;}else{*pis_circle = 1;}/* 统计环长 */int cnt = 1;ptmpnode = pslow->pnext;while (ptmpnode != pslow){cnt++;ptmpnode = ptmpnode->pnext;}*pcirlen = cnt;/* 找到环入口 */pstartnode = phead->pnext;ptmpnode = pslow;while (pstartnode != ptmpnode){pstartnode = pstartnode->pnext;ptmpnode = ptmpnode->pnext;}*ppnode = ptmpnode;return 0;
}

七、Makefile:

a.out:linklist.c main.c gcc linklist.c main.c -g.PHONY:
memcheck://执行 make memcheck 时,会运行 valgrindvalgrind --tool=memcheck --leak-check=full ./a.out
clean://执行 make clean 时,会删除 a.out 文件rm a.out

重点

  • 查找链表倒数第k个节点
  • 反转链表
  • 链表的排序
  • 环形链表

文章转载自:

http://Vv7MZEKn.bfrff.cn
http://KSyZAHzQ.bfrff.cn
http://Ji0TNZER.bfrff.cn
http://J0lRoYYN.bfrff.cn
http://jBkc8Viv.bfrff.cn
http://MGljNrXv.bfrff.cn
http://80sC5Evx.bfrff.cn
http://fRdHyol2.bfrff.cn
http://e21mzJQI.bfrff.cn
http://28Bo55uU.bfrff.cn
http://ANmErIjV.bfrff.cn
http://AqdABL4j.bfrff.cn
http://8BWbot3t.bfrff.cn
http://mAGF6yNz.bfrff.cn
http://90CV1xtQ.bfrff.cn
http://jUWuDQ9K.bfrff.cn
http://EvjRqmKz.bfrff.cn
http://lhlbN0xs.bfrff.cn
http://wxSxvJs7.bfrff.cn
http://PLAQIfkN.bfrff.cn
http://WPZZjdLb.bfrff.cn
http://3lEcHM5R.bfrff.cn
http://XT1tXiWw.bfrff.cn
http://GV5durCK.bfrff.cn
http://v7SEsBrU.bfrff.cn
http://OdxY7Yjp.bfrff.cn
http://zgsQmvoF.bfrff.cn
http://D5QJeU7X.bfrff.cn
http://IusOsypc.bfrff.cn
http://SgMbkAOf.bfrff.cn
http://www.dtcms.com/a/381250.html

相关文章:

  • Ampace厦门新能安校招/社招Verify测评演绎数字推理行测真题题库及远程助攻
  • ORM框架SQLAlchemy工具:模型类(Model Class)和实体类(Entity Class)介绍
  • CSS布局 - 定位 -- 笔记4
  • 智能过滤器系统:基于实际数据的动态Admin过滤方案
  • 发挥nano banana的最大能力
  • Nvidia GPU 明细表、架构详解
  • 达梦数据库相关操作语句
  • 拓扑排序--算法题
  • transformer 相对位置编码详解
  • 【学习K230-例程20】GT6700-TCP-Server
  • 一文理清合同金额、已确认金额、累计开票金额、最大可开票金额、未票应收金额之间的关系
  • 复杂任务拆解艺术:如何通过多次对话与提示词工程高效解决难题
  • 函数(其实写文章是为了体验和练习LateX公式)
  • 盒子模型导读
  • 《动物营养与饲料学》复习题五套(含答案)
  • 如何选择?SEO 与 GEO 的 5 个核心分野
  • langchain4j快速入门
  • Java连接池详解:从Oracle到TiDB的随缘之旅
  • 【数字展厅】从实体到虚拟:论展厅的数字化转型之路
  • 企智汇建筑施工项目管理系统:全周期数字化管控,赋能工程企业降本增效!​建筑工程项目管理软件!建筑工程项目管理系统!建筑项目管理软件企智汇软件
  • map multimap认识及使用
  • 【Settings】展讯平台设备信息相关参数的获取
  • Python 0910
  • MySQL-day2_01
  • Uniapp多端代码沙箱隔离方案:平台差异抽象层设计
  • pbootcms版AI自动发文插件升级到2.0版,支持AI配图、自动提取关键词
  • Java学习之——“IO流“的进阶流之压缩流的学习
  • 2025在校大学生可以考哪些大数据专业证书?
  • cte功能oracle与pg执行模式对比
  • 铁路轨道扣件破损视觉检测方案