推断单向链表中是否有环和查找环的入口
快慢指针
算法描写叙述
定义两个指针slow, fast。
slow指针一次走1个结点,fast指针一次走2个结点。假设链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast)。假设没有环,则快指针会第一个走到NULL。
实现
结点定义例如以下:
class Node {public Node next;public Object data;public static int sequence = 0;
}
算法:
/*** 快慢指针* @param head* @return*/public static boolean checkCircle(Node head) {Node fast = null;Node slow = null;fast = head;slow = head;while (true) {// 慢指针移动一步if (null != slow.next) {slow = slow.next;} else {return false;}// 快指针移动两步if (null != fast.next && null != fast.next.next) {fast = fast.next.next;} else {return false;}// 检查是否相遇if (slow == fast) {return true;}}}
步数检查
算法描写叙述
上面的算法仅仅能推断链表中有没有环,假设我们想找出环的入口怎么办呢?
定义两个指针p, q。p每走一个结点(即一步),q则从头一直向后走,直到q走到NULL或p, q走到同一个结点但走过的步数不同样为止。
此时q的步数就是环入口在结点中的位置。假设走到NULL则说明链表不存在环。
为什么p, q走到同一个结点但步数不相等时就说明有环呢?由于假设p, q步数同样,说明它们走过的结点是一样的,假设p, q步数不同了。则说明p是从环里走了一圈又回到了环的入口。此时q到达该结点时还没有走过环,因此步数不相等,并且此时q的步数就是环的入口。
实现
/*** 查找环的起点* @param head* @return 返回元素的索引,从0開始。没有找到返回-1*/public static int findCircleEntry(Node head) {Node p = head; // 总是从头開始Node q = head;int pSteps = 0;int qSteps = 0;while (null != q.next) {q = q.next;++qSteps;// p从头開始走while (null != p.next) {p = p.next;++pSteps;// 当p与q指向同一个结点时if (p == q) {// 假设走的步数不同,则这就是入口if (pSteps != qSteps) {return pSteps - 1;} else {// 走的步数同样,不是入口break;}}}p = head; // 回到头结点pSteps = 0;}// 当中有一个指针走到了头,说明没有环return -1;}
推断单向链表中是否有环和查找环的入口相关推荐
- 华为机试HJ51:输出单向链表中倒数第k个结点
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针. ...
- 单向链表中查找倒数第K个数
问题 单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数; 用两个指 ...
- 快慢指针判断链表中是否存在环以及查找环的起始位置
判断链表中是否有环? 使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢? 因为slow指针和fast指针 ...
- java单向链表中的头插法与尾插法
单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释.数据结构 首先定义好链表中的节点类: 其中,data表明节点所存放的数据,next表明指向下一节点 ...
- 快慢法判断单链表中是否有循环链表
题目:写个算法,判断在一个单向链表中是否存在循环链表. 有个经典的算法就是解决这个问题的,好象是叫快慢法.他的原理是,如果A,B两人从同一地点出发,B的速度大于A,那么如果存在一个环的话,B和A肯定是 ...
- 应用-单向链表-数据结构和算法
文章目录 1 单向链表反转 2 快慢指针 2.1 中间值问题 2.2 单向链表是否有环 2.3 有环链表入口 3 后记 1 单向链表反转 需求:原链表数据1->2->3->4,反转之 ...
- Day 62 数据结构(单向链表,单向循环链表,双向链表)
1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...
- 判断链表中是否有环链
思路:判断链表中是否有环,可以使用快慢指针(fast low)遍历链表实现,fast每次走两步,low每次走一步,如果他们在链表中相遇,则说明有环,否则fast提前遇上NULL,说明链表无欢. 关键代 ...
- 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...
链表的操作总结 链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...
最新文章
- 大型网站系统架构演化之路(转)
- 【Python问题解决】关于解决python3.x无法使用PIL库的解决方法
- Spring实现AOP的4种方式
- 【ABAP妙用】复制ALV之负号提前
- 复现经典:《统计学习方法》第12章 监督学习方法总结
- 深入理解golang 的栈
- JavaScript自执行匿名函数
- 合并excel文件 C语言,多个Excel文件中的多个Sheet合并到一个Excel文件中两个函数...
- 甘特图控件VARCHART XGantt:XGantt的用途
- android p 小米6,小米6 想升级 Android P,系统软件工程师发话:可适配
- 企业无线接入平台好吗
- 中国慕课moocpython答案_中国大学慕课moocPython编程基础章节测试答案
- python中ospathjoin_python-在Windows上与os.path.join混合斜杠
- jQuery+js+css实现键盘按键呼吸灯效果
- 矩阵在线计算机,矩阵计算器
- 员工管理系统(完整版)
- 音视频开发为什么要学SRS流媒体服务器
- 开学第一周——自我介绍
- Maria840js面试题:不使用中间变量,交换int型的 a, b两个变量的值
- 小达人点读笔的任我贴贴纸怎么使用?