快慢指针

算法描写叙述

定义两个指针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;}

推断单向链表中是否有环和查找环的入口相关推荐

  1. 华为机试HJ51:输出单向链表中倒数第k个结点

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针. ...

  2. 单向链表中查找倒数第K个数

    问题 单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数; 用两个指 ...

  3. 快慢指针判断链表中是否存在环以及查找环的起始位置

    判断链表中是否有环?    使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢?    因为slow指针和fast指针 ...

  4. java单向链表中的头插法与尾插法

    单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释.数据结构 首先定义好链表中的节点类: 其中,data表明节点所存放的数据,next表明指向下一节点 ...

  5. 快慢法判断单链表中是否有循环链表

    题目:写个算法,判断在一个单向链表中是否存在循环链表. 有个经典的算法就是解决这个问题的,好象是叫快慢法.他的原理是,如果A,B两人从同一地点出发,B的速度大于A,那么如果存在一个环的话,B和A肯定是 ...

  6. 应用-单向链表-数据结构和算法

    文章目录 1 单向链表反转 2 快慢指针 2.1 中间值问题 2.2 单向链表是否有环 2.3 有环链表入口 3 后记 1 单向链表反转 需求:原链表数据1->2->3->4,反转之 ...

  7. Day 62 数据结构(单向链表,单向循环链表,双向链表)

    1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...

  8. 判断链表中是否有环链

    思路:判断链表中是否有环,可以使用快慢指针(fast low)遍历链表实现,fast每次走两步,low每次走一步,如果他们在链表中相遇,则说明有环,否则fast提前遇上NULL,说明链表无欢. 关键代 ...

  9. 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...

    链表的操作总结   链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...

最新文章

  1. 大型网站系统架构演化之路(转)
  2. 【Python问题解决】关于解决python3.x无法使用PIL库的解决方法
  3. Spring实现AOP的4种方式
  4. 【ABAP妙用】复制ALV之负号提前
  5. 复现经典:《统计学习方法》第12章 监督学习方法总结
  6. 深入理解golang 的栈
  7. JavaScript自执行匿名函数
  8. 合并excel文件 C语言,多个Excel文件中的多个Sheet合并到一个Excel文件中两个函数...
  9. 甘特图控件VARCHART XGantt:XGantt的用途
  10. android p 小米6,小米6 想升级 Android P,系统软件工程师发话:可适配
  11. 企业无线接入平台好吗
  12. 中国慕课moocpython答案_中国大学慕课moocPython编程基础章节测试答案
  13. python中ospathjoin_python-在Windows上与os.path.join混合斜杠
  14. jQuery+js+css实现键盘按键呼吸灯效果
  15. 矩阵在线计算机,矩阵计算器
  16. 员工管理系统(完整版)
  17. 音视频开发为什么要学SRS流媒体服务器
  18. 开学第一周——自我介绍
  19. Maria840js面试题:不使用中间变量,交换int型的 a, b两个变量的值
  20. 小达人点读笔的任我贴贴纸怎么使用?

热门文章

  1. USACO-Section1.5 Mother's Milk (深度优先搜索)
  2. 企业安全建设之自动化代码扫描(代码审计)
  3. centos7操作SSH/SSHD服务(查看/启动/重启/自启)
  4. 查找算法:斐波那契查找算法实现及分析
  5. C# ---- GC中代的递增规律
  6. C# Linq to Entity Lamda方式分组并求和求平均值
  7. 参加kaggle比赛
  8. sql 基础--mysql 5
  9. 2021上半年朋友圈都在传的10本书,找到了
  10. 西安交大送大一新生这本书,你读过吗?12本有趣有料的科普书盘点