检测一个链表是否有环

 

  定义两个指针fast、slow,其中,fast是快指针,slow是慢指针,二者的初始值都指向链表头,

  slow每次前进一步,fast每次前进两步,两个指针同时向前移动,快指针每移动一次都要跟慢指针比较,直到快指针等于慢指针为止,就证明了这个链表是带环的单向链表。

  否则,这个是不带环的链表(fast先行到达尾部为NULL,则为无环链表)。

  代码:

  public boolean IsLoop(Node head)  //判断是否有环的函数

  {

    Node fast = head;

    Node slow = head;

  if(fast == null)

  {

    return false;

  }

  while(fast != null  &&  fast.next != null)

  {

    fast = fast.next.next; //快指针每次走两步

    slow = slow.next;  //慢指针每次走一步

    if(fast == slow) //每移动一次都进行比较;当快指针等于慢指针时,则就是带环的单向链表

    {

      return true;

    }

  }

return ! (fast==null || fast.next==null); //无环

}

  

时间: 2024-08-06 03:13:32

检测一个链表是否有环的相关文章

一个链表中包含环,请找出该链表的环的入口结点

方法一.用HashSet来解决 1 public ListNode EntryNodeOfLoop(ListNode pHead){ 2 HashSet<ListNode> hs = new HashSet<ListNode>(); 3 while(pHead!=null){ 4 if(!hs.add(pHead))//如果包含了,那么这个就是入口结点 5 return pHead; 6 pHead = pHead.next; 7 } 8 return null; 9 } 方法二.

判断一个链表是否有环的几种方法

一.单链表是否有环 思路分析: 单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构.判断链表是否有环,有以下几种方法. 1 // 链表的节点结构如下 2 typedef struct node 3 { 4 int data; 5 struct node *next; 6 } NODE; (1)最常用方法:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步.如果走得快的指针追上了走得慢的指针,那么链表就是

判断一个链表是否有环

思路:如果开始有两个指针指向头结点,一个走的快,一个走的慢,如果有环的话,最终经过若干步,快的指针总会超过慢的指针一圈从而相遇. 如何计算环的长度呢?可以第一次相遇时开始计数,第二次相遇时停止计数. 如何判断环的入口点?碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点.头指针开始走,相遇的那个点就是连接点. 当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈.假设slow走了s步,那么fast走了2s步.fast的步数还等于s走的加上

检测单链表是否有环

快慢指针:如果没有环,快指针一定先走完,两个指针不会相遇:如果有环,那么最多只有一个环,并且两个指针迟早都会进入环,假定环的长度为L,当慢指针进入环之后,快指针每次能向前追一步距离,最多只要L-1步就能追上慢指针所以可以用两个指针是否相遇来判断是否有环.

Java数据结构-线性表之链表应用-检测链表是否有环

??如何检测一个链表是否有环?这个是一个出现频率较高的面试题. ??如下是一个含有环的链表. (图片来自http://www.nowamagic.net/librarys/veda/detail/2245 一个有很多关于数据结构的文章的网站,还有其他的资料,可以看看) 我这里解题的方法有三种: 快慢指针方法:两个速度不一样的指针遍历总会相遇: 利用环的顶点数和边相等的关系: 两个指针遍历判断步数是否相等. ??为了实现检查链表是否含有环的情况,我们需要先构建出一个含有环的链表. ??于是乎我在之

11.判断单链表是否有环

判断单链表是否有环:   这里也是用到两个指针,如果一个链表有环,那么用一个指针去遍历,是永远走不到头的.   因此,我们用两个指针去遍历:first指针每次走一步,second指针每次走两步,如果first指针和second指针相遇,说明有环.时间复杂度为O (n). 方法 // 方法:检测单链表是否有环 public boolean hasCycle(Node head) { if (head == null) { return false; } Node first = head; Nod

判断单链表是否有环及寻找环的入口

一.判断单链表是否有环 1.遍历链表 遍历链表,将已经访问过的结点,设置为已访问,如果访问同一结点两次,则说明有环,时间O(n),空间O(n). 2.链表反转 遍历链表,将访问的结点指针反向.如果存在环,反转后next指向原链表头,但链表反转会破坏链表的结构,反转需要注意缓存当前结点的下一结点,时间O(n),空间(1). 3.快慢指针 设置快慢两个指针fast和slow,两个指针都链表头开始,fast每次移动2步,slow为1步.如果存在环,则fast先进入环,slow后进入环,最后两者在环中相

判断单链表是否有环相关问题(转载加总结)

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

判断链表是否有环及入口点

判断链表是否有环方法--快慢指针 一. 问:如何判断是否有环? 答:如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈. 设置两个指针(fast,slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇.(当然,fast先行头到尾部为NULL,则为无环链表). #include <stdio.h> typedef struct ListNode { int val