快慢指针
所谓快慢指针中的快慢指的是指针向前移动的步长,每次移动的步长较大即为快,步长较小即为慢,常用的快慢指针一般是在单链表中让快指针每次向前移动2,慢指针则每次向前移动1。
快慢指针在提高查找性能方面的作用还是比较可观的,如以下应用:
(1)如何快速找出未知长度单链表的中间节点?
普通方法:先遍历一遍单链表确定其长度L后,再从头节点出发循环L/2次即可查找到单链表的中间节点。该问题如果采用普通的方法虽然简单,但是查找效率太低。
快慢指针:设置两个指针*fast、*slow都指向单链表的头节点,其中*fast的移动速度是*slow的2倍,当*fast指向末尾节点的时候,slow正好就在中间了,可以大大提高查找的效率。
当然,此时算法还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时可以实际情况返回上中位数或下中位数或(上中位数+下中位数)的一半。
1 while (fast&&slow) 2 { 3 if (fast->next==NULL) 4 return slow ->data; 5 else if (fast->next!= NULL && fast->next->next== NULL) 6 return (slow ->data + slow ->next->data)/2; 7 else 8 { 9 fast= fast->next; 10 fast= fast->next; 11 slow = slow ->next; 12 } 13 }
(2)如何快速检测单链表是否存在循环?
利用快慢指针的原理,同样设置两个指针*fast、*slow都指向单链表的头节点,其中*fast的移动速度是*slow的2倍。如果*fast=NULL,说明该单链表以NULL结尾,不是循环链表;如果*fast=*slow,则快指针追上慢指针,说明该链表是循环链表。
1 fast=slow=head; 2 fast=fast->next->next; 3 while(true){ 4 if (fast==NULL || fast->next==NULL) 5 return false; 6 else if (fast==slow || fast->next==slow) 7 return true; 8 else{ 9 fast=fast->next->next; 10 slow=slow->next; 11 }

博文作者:twobin
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
如果阅读了本文章,觉得有帮助,您可以为我的博文点击“推荐一下”!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述