思路:快慢指针实现

用两个指针,一个指针一次走一步,另一个指针一次走两步,如果存在环,则这两个指针会在环内相遇,时间复杂度为O(n)

  /*** 检测单链表中是否有环*/public static boolean hasCircle(ListNode head) {if(null == head) {return false;}ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;if(fast == slow){return true;//两个指针相遇
            }}return false;}

拓展1:如果单链表有环,找出环的入口节点(环的连接点)

  /***如果单链表有环,找出环的入口节点(环的连接点)。*这里先证明一个定理:碰撞点到连接点的距离=头指针到连接点的距离*假设单链表的总长度为L,头结点到环入口的距离为a,环入口到快慢指针相遇的结点距离为x,环的长度为r,*慢指针总共走了s步,则快指针走了2s步。另外,快指针要追上慢指针的话快指针至少要在环里面转了一圈多(假设转了n圈加x的距离)*得到以下关系:*s = a + x*2s = a + nr + x*=>a + x = nr*=>a = nr - x //入口点*/public static ListNode searchEntranceNode(ListNode head) {ListNode slow=head;//p表示从头结点开始每次往后走一步的指针ListNode fast=head;//q表示从头结点开始每次往后走两步的指针while(fast !=null && fast.next !=null) {slow=slow.next;fast=fast.next.next;if(slow==fast) {break;//p与q相等,单链表有环
            }}if(fast == null || fast.next == null){return null;}slow=head;while(slow != fast){slow=slow.next;fast=fast.next;}return slow;}

  public static ListNode searchEntranceNode1(ListNode head){if(head == null || head.next == null)return null;ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null ){slow = slow.next;fast = fast.next.next;if(slow == fast){fast=slow;//相遇点slow=head;while(slow != fast){slow = slow.next;fast = fast.next;}if(slow == fast)return fast;}}return null;}

拓展二:求链表中环的长度

    /*** 求环的长度*/public static int countCircleSize(ListNode head) {ListNode entranceNode = searchEntranceNode1(head);//环的入口点if(entranceNode == null) {return 0;}ListNode slow = entranceNode.next;int size = 1;while(slow != entranceNode) {slow = slow.next;size++;}return size;}

转载于:https://www.cnblogs.com/cherish010/p/10572378.html

判断一个单链表中是否有环相关推荐

  1. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  2. 判断一个单链表中是否存在环

    #判断一个单链表中是否存在 环. #设置两个指针(fast, slow),初始值都指向头,slow每次前进1步,fast每次前进2步, 大概的思路如下: 如果链表存在环,则fast必定先进入环,而sl ...

  3. 【数据结构】判断一个单链表中各结点的值是否有序

    count记录的是单链表的总长 count1记录的是升序的结点的个数 count2记录的是降序的结点的个数 如果count1或者count2等于count,那么就说明该序列是升序或者降序的. 稍加改进 ...

  4. 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

    检测单链表中是否有环(C语言) 方法:双指针法思路 使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二. 在链表有环时,two指针与one指针相等就说明有环. ...

  5. 用python 判断一个单链表是否有环

    文章目录 用python 判断一个单链表是否有环. 第二次做DAY20201130 [141. 环形链表](https://leetcode-cn.com/problems/linked-list-c ...

  6. 判断一个单链表是否有环,若有,找出环的入口节点

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点. 一.单链表是否有环 思路分析: 单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形 ...

  7. 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...

    题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少?   解法: 1.对于问题1,使用追赶的方法 ...

  8. c语言 判断链表之中是否有环,判断单链表中是否存在环(网上说的笔试题)

    2015-10-06 06:30:02 阅读( 83 ) #include "stdafx.h" typedef char eleType;    // 定义链表中的数据类型 ty ...

  9. 如何判断一个单链表是否有环?

    快慢指针查询,快指针每次跳两个,慢指针每次跳一个,如果两指针相等时,就证明有环 环的入口: 用两个指针,一个指向快慢指针相交点(这里就是慢指针走,慢指针在走快指针的一半就相当于快指针走的路了,还会到这 ...

最新文章

  1. ResNet及其变体结构梳理与总结
  2. SAP HUM嵌套HU研习之HU03显示内层HU数据
  3. 《用Python进行自然语言处理》第 11 章 语言数据管理
  4. c++找不到标识符_沪C转沪牌流程攻略大全
  5. Ardino基础教程 25_8X8LED点阵
  6. 编写一个c程序的头文件
  7. java注释日志打印_java 注解结合 spring aop 实现自动输出日志
  8. php-fpm通过request_slowlog_timeout检查哪个脚本执行时间长
  9. [HDU] 1181 变形课-简单建模后广搜
  10. JDK14性能管理工具:jstack使用介绍
  11. 在安装好python后文件显示还是应用程序_在djang中找不到已安装的应用程序
  12. 51nod1347(简单逻辑)
  13. java中各种集合的用法和比较
  14. npm配置镜像、设置代理
  15. java开发特殊技能怎么填_【程序员简历】IT技能/编程技能应当怎么写?
  16. python、R对比分析
  17. clickhouse创建外部字典表
  18. 二等分计算机打印机尺寸,241两等分打印纸尺寸 电脑打印纸,规格241mm等份是2等份,是多大的纸呀?...
  19. 常见的几种锁(互斥锁,自旋锁,乐观锁,悲观锁)
  20. 蓝牙耳机选哪个?盘点双十二必入的高性价比蓝牙耳机

热门文章

  1. cgi、wsgi、uwsgi 与 uWSGI
  2. 值得收藏的JSP连接mysql数据库的例子
  3. 前后台传参类型、格式不同,解决思路
  4. Oracle数据库的视图
  5. Flex Socket 安全沙箱问题解决
  6. winphone8更换帐号问题的几点说明
  7. 快手文档 - www.kuaishou.net
  8. 不要忽视任何小问题!!!一个XML的XPath的问题.....
  9. 嵌入式linux 实现mdev SD卡和U盘自动挂载和卸载的方法 mdev.conf
  10. 42 | 案例篇:如何优化 NAT 性能?(下)