快慢指针判断单向链表是否有环及找环入口
前言
关于快慢指针找环入口的这个问题,之前巴特跟我聊到过,印象比较深,今晚看学长在做的面试题,里面就出现了这个小知识。
发现有些东西不经意间就会用到,于是便出现此文。以后要努力做到善于总结,乐于总结。
概念
快慢指针,所谓的快慢,就是指指针每次移动的步长,通常使快指针每次向前移动两步,慢指针每次向前移动一步。
判断链表环及找环入口
操作
从链表头节点开始,快慢指针同时开始移动,快指针每次移动2,慢指针每次移动1,若快指针最终与慢指针相遇,则表示链表有环,否则,则为无环。
有环情况下,快慢指针相遇时,慢指针位置不变,将快指针置回表头,步长改为每次移1,快慢指针同时开始移动,再次相遇处即为环的入口。
原理
判断是否有环就不解释了,下面主要解释,为什么可以那样找环入口。
⬇️<-<-<-⬆️⬇️ ⬆️
♦️->->->⬇️->->->⬆️
A B C
只是个简单图,就不专门做图了,凑合表示下吧。
♦️也就是A的位置是头节点,B表示环入口处,C表示快慢指针第一次相遇处。
在C处相遇时,设慢指针跑了N步,也就是从A开始N步后会到达C。
快指针比慢指针走的快一倍,也就是走了2*N步。那么慢指针从C处再跑N步还会回到C处。
既然都会回到C处,那么必然会在B点第一次相遇。
所以我们在入口处再设一指针(用之前快指针即可),与慢指针用1步长同时前进,第一次相遇处就是环入口处。
代码
/* 代码很简单 */
List* func(List* Head)
{List* fast, slow;fast = slow = Head;while(fast != slow && fast != NULL){slow = slow->next;fast = fast->next;if(fast != NULL)fast = fast->next;}if(fast == NULL)return true;fast = Head;while(fast != slow){fast = fast->next;slow = slow->next;}return fast;
}
其他应用
譬如,给定一有序链表,求其中位数,因为不知道链表的具体长度,常规做法是先遍历一次,确定链表的长度,再遍历到中点,求出中位数。
但其实还有个更巧妙的法子,很方便的求出中位数,就是用快慢指针。
仍然是快指针步长为2,慢指针步长为1,当快指针到达链表尾部的时候,快指针就处于中点位置.(会牵扯到链表总数奇偶的情况,判断下即可,这里就不多赘述了)。
快慢指针判断单向链表是否有环及找环入口相关推荐
- 利用快慢指针判断循环
今天在leetcode刷题时,碰到一个好玩的简单题 其实这道题的题干非常简单易懂,但是涉及到了一个无限循环的可能. 从数学上来说,如何证明它是无限循环而不是无限不循环也许是一个有挑战性的问题,但是这里 ...
- 快慢指针判断链表中是否存在环以及查找环的起始位置
判断链表中是否有环? 使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢? 因为slow指针和fast指针 ...
- 快慢指针判断链表是否有环
链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环. 我有时候就犯嘀咕,它俩一定 ...
- 使用快慢指针判断链表是否有环
有时候在面试中可能会遇到叫我们判断链表中是否有环的问题,这个问题的解决方法也很多,这里我记录一下比较简单的使用快慢指针的方法: 使用快慢指针是指: 设置两个指针,一快一慢,快指的是每次移动两步,慢指针 ...
- 快慢指针判断链表中是否有环
基本思想 快指针:从头开始移动 每次移动两个距离 慢指针:从头开始移动 每次移动一个距离 如果单链表中存在有环的话,那么快慢指针一定是会相遇的. 为什么?首先快指针在环内肯定是可以追上慢指针的对吧,那 ...
- php单链表检测有没有环,写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点...
首先,关于单链表中的环,一般涉及到以下问题: 1.给一个单链表,判断其中是否有环的存在: 2.如果存在环,找出环的入口点: 3.如果存在环,求出环上节点的个数: 4.如果存在环,求出链表的长度: 5. ...
- 如何判断单向链表有环?
昨天去面试了一把,面试官给出了这道题.当时我知道一定有什么巧妙的办法,但是我并没有想到.我只是想到了通用的方法,顺序遍历然后为遍历过的节点依次做标志.也试图去想了些特殊的访法,不过都有一定的局限性.事 ...
- 快慢法判断单链表中是否有循环链表
题目:写个算法,判断在一个单向链表中是否存在循环链表. 有个经典的算法就是解决这个问题的,好象是叫快慢法.他的原理是,如果A,B两人从同一地点出发,B的速度大于A,那么如果存在一个环的话,B和A肯定是 ...
- 详细总结快慢指针的在链表中的常见题型
常见快慢指针题型 1.找出链表中间结点 2.找到倒数第K个结点 3.判断环形链表 4.找到环形链表的入口(进阶) 5.相交链表 1.找出链表中间结点 双指针进阶解法 1.定义两个指针,一个快指针,一个 ...
最新文章
- [论文摘录] Classification of SOA Contract Specification Languages(ICWS, 2008), 第二部分
- 工信部公布《通信网络安全防护监督管理办法(征求意见稿)》
- SQL Server 2005系列教学(14) 用户管理
- thinkphp中配置信息的二维数组设置与使用
- IBM的SOA方法论之一——五个切入点和八个场景
- 必须掌握的八种排序(7-8)--归并排序,基数排序
- pythonclass的使用详情_python 类class基础简明笔记
- 常用办公软件推荐和使用
- 如何绕过mac地址过滤_如何通过路由器来过滤无线MAC地址
- 组合数计算(从1000到1e9的组合数各类求法)
- php 数字上下选取,选择性粘贴数值快捷键是什么
- php连接外卖打印机,javaScript 连接打印机,打印小票实例分享
- 数据分析在网络营销中的意义有哪些
- 【训练记录】2013-2014 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest @homework-7
- 申请计算机语言学留学要求,布兰迪斯大学计算机语言学文学硕士研究生申请要求及申请材料要求清单...
- 中国三相开关磁阻电动机行业市场供需与战略研究报告
- 线缆选择及压降计算说明
- JS中every()方法
- python 可视化案例_Python之路 08 数据可视化案例
- pogo pin连接器与排针、排母的寿命区别