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

数据结构---单链表(常见的复杂操作)

目录

一、单链表

1.1.查找中间元素

 1.2.查找倒数第K个节点

 1.3.链表倒置

 1.4.冒泡排序

 1.5.选择排序

1.6.环,确认有环单链表的环入口和环大小

二、总结


一、单链表

1.1.查找中间元素

        定义两个指针,分别指向第一个元素,第一个指针每次向后遍历两个节点,第二个指针向后遍历一个节点,最终当第一个指针遍历到最后一个时,第二个也就刚好指向中间节点。

LinkList *FindMidLinkList(LinkList *phead)
{LinkList *pfast = NULL;LinkList *pslow = NULL;if (phead->pnext == NULL){return NULL;}pfast = pslow = phead->pnext;while (pfast != NULL){pfast = pfast->pnext;if (NULL == pfast){break;}pfast = pfast->pnext;if (NULL == pslow){break;}pslow = pslow->pnext;}return pslow;}

 1.2.查找倒数第K个节点

           定义两个指针,分别指向头节点,先让第一个指针向后遍历k次,让两个指针之间相差k个位置,然后让他们一起向后遍历,直到第一个指针指向最后一个节点,此时第二个指针就指向倒数第k个位置。

LinkList *FindTailKLinkList(LinkList *phead, int k)
{   LinkList *pfast = NULL;LinkList *pslow = NULL;if (phead->pnext == NULL){return NULL;}pfast = phead;pslow = phead;for (int i = 0; i < k; i++){pfast = pfast->pnext;if (pfast == NULL){break;}}if (pfast == NULL){return phead;}while (pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;}

 1.3.链表倒置

        将链表的数据链与头节点分开,然后依次头插法插入头节点后面,完成倒置 

int HeadInvertLinkList(LinkList *phead)
{LinkList *ptmp = NULL;LinkList *qtmp = NULL;ptmp = phead->pnext;phead->pnext = NULL;qtmp = ptmp;while(qtmp != NULL){qtmp = qtmp->pnext;ptmp->pnext = phead->pnext;phead->pnext = ptmp;ptmp = qtmp;}return 0;
}

 1.4.冒泡排序

int BulleSortLinkList(LinkList *phead)
{LinkList *ptmp1 = NULL;LinkList *ptmp2 = NULL;LinkList *qtmp = NULL;DataType data = 0;//链表只有头节点或只有一个数据节点,不需要排序if (phead->pnext == NULL || phead->pnext->pnext == NULL){return 0;}ptmp1 = phead->pnext;ptmp2 = phead->pnext->pnext;while (1){ptmp1 = phead->pnext;ptmp2 = phead->pnext->pnext;if (ptmp2 == qtmp){break;}while (ptmp2 != qtmp){if (ptmp1->data < ptmp2->data){data = ptmp1->data;ptmp1->data = ptmp2->data;ptmp2->data = data;}ptmp1 = ptmp1->pnext;ptmp2 = ptmp2->pnext;}qtmp = ptmp1;}return 0;}

 1.5.选择排序

int SelectSortLinkList(LinkList *phead)
{LinkList *ptmp1 = NULL;LinkList *ptmp2 = NULL;LinkList *qtmp = NULL;DataType data = 0;//链表只有头节点或只有一个数据节点,不需要排序if (phead->pnext == NULL || phead->pnext->pnext == NULL){return 0;}qtmp = phead->pnext;while (qtmp->pnext != NULL){ptmp1 = qtmp;ptmp2 = qtmp->pnext;while(ptmp2 != NULL){if (ptmp2->data < ptmp1->data){ptmp1 = ptmp2;}ptmp2 = ptmp2->pnext;}if (ptmp1 != qtmp){data = ptmp1->data;ptmp1->data = qtmp->data;qtmp->data = data;}qtmp = qtmp->pnext;}}

1.6.环,确认有环单链表的环入口和环大小

 

          定义两个指针,分别指向第一个元素,第一个指针每次向后遍历两个节点,第二个指针向后遍历一个节点,可以保证两个指针的差程自然数增长,这样两个指针终会在环里相遇。

LinkNode *IsHasCircle(LinkNode *pHead, int *pcnt)
{LinkNode *pFast = NULL;LinkNode *pSlow = NULL;LinkNode *pTmpNode = NULL;LinkNode *pNode1 = NULL;LinkNode *pNode2 = NULL;int ret = 0;int cnt = 1;pSlow = pFast = pHead->pNext;while (1){pFast = pFast->pNext;if (NULL == pFast){ret = 0;break;}pFast = pFast->pNext;if (NULL == pFast){ret = 0;break;}pSlow = pSlow->pNext;if (pSlow == pFast){ret = 1;break;}}if (1 == ret){//获得环长pTmpNode = pSlow->pNext;while (pTmpNode != pSlow){cnt++;pTmpNode = pTmpNode->pNext;}*pcnt = cnt;//获得环入口位置pNode1 = pSlow;pNode2 = pHead->pNext;while (1){pNode1 = pNode1->pNext;pNode2 = pNode2->pNext;if (pNode1 == pNode2){return pNode1;}}}return NULL;
}

二、总结

        单链表的基本操作必须熟链,以便对栈队列的理解。环,这个问题的处理思路也要熟悉,感觉很有趣。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenAI 神秘模型「草莓」预计今秋推出,ChatGPT 将迎重大升级|TodayAI
  • Flutter 自动化测试 -appium-flutter-driver
  • git clone 别人的项目上传到自己的Gitee或者github仓库
  • 小白指南:Linux怎么创建压缩包?又怎么解压缩?
  • 让甲方看得见服务器资源降本增效-软件开发不仅考虑开发成本也要重视长期的运维成本
  • Java基础(4)- IDEA
  • 嵌入式软件开发之状态机与事件驱动分析
  • 鲲鹏服务器之ARM探知
  • QString 初始化
  • 主成分分析PCA通用代码(输出world报告)
  • [大模型]源码安装-Langchain-Chatchat-V0.3
  • 【初阶数据结构】顺序表和链表算法题(下)
  • 图像处理中的对抗性研究:浅谈水印去除技术
  • Golang学习笔记-Golang中的锁
  • Linux上安装Conda以管理Python环境
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • CAP 一致性协议及应用解析
  • es的写入过程
  • in typeof instanceof ===这些运算符有什么作用
  • JAVA并发编程--1.基础概念
  • Java-详解HashMap
  • Spring Boot快速入门(一):Hello Spring Boot
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 基于 Babel 的 npm 包最小化设置
  • 简单实现一个textarea自适应高度
  • 离散点最小(凸)包围边界查找
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 原生js练习题---第五课
  • 再谈express与koa的对比
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1)Hilt的基本概念和使用
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (七)glDrawArry绘制
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)linux文件内容查看
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Remoting常用部署结构
  • .NET 的程序集加载上下文
  • .NET 事件模型教程(二)
  • .netcore如何运行环境安装到Linux服务器
  • .net开发日常笔记(持续更新)
  • .net下的富文本编辑器FCKeditor的配置方法
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @EnableAsync和@Async开始异步任务支持
  • @selector(..)警告提示
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [20170728]oracle保留字.txt
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)