java 链表中是否有环

public class 链表中是否有环
{
    class ListNode
    {
        ListNode next;
        int val;

ListNode(int x)
        {
            this.val = x;
            this.next = null;
        }
    }

public boolean hasCycle(ListNode head)
    {
        if (head == null)
        {
            return false;
        }
        // 利用长短步,快的指针两个结点,慢的指针一步一个结点,当快的指针遇见null结束 则链表中没有环,若快的指针遇到慢的指针则,链表中有环
        ListNode quick = head;
        ListNode slow = head;
        while (quick.next != null && quick.next.next != null)
        {
            quick = quick.next.next;
            slow = slow.next;
            if (quick == slow)
            {
                return true;
            }
        }
        return false;
    }
}

时间: 2024-10-05 20:30:53

java 链表中是否有环的相关文章

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

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

Q:判断链表中是否存在环的相关问题

问题:如何判断一个单向链表中是否存在环? 例如: 链表中存在环(B-->D): <-- <--^ | | v | A-->B-->C-->D 链表中不存在环: A-->B-->C-->D-->E-->F 解题思路: ??从一个实际的生活场景出发,两个人,在一个环形的操场上跑步的时候,如果有一个人跑得比另一个人还要快,那么,在n圈之后,这两个人总会在操场上的某个点相遇.将操场类比于链表中存在的环路径,将两个人看成两个指针,那么这道题的解题思路

LeetCode -- 判断链表中是否有环

思路: 使用两个节点,slow和fast,分别行进1步和2步.如果有相交的情况,slow和fast必然相遇:如果没有相交的情况,那么slow或fast必然有一个为null 相遇时有两种可能:1. 只是节点相交的情况,即:slow == fast但是 slow.next != fast.next2. 链表中存在环,即slow == fast 而且 slow.next == next 实现代码: public bool HasCycle(ListNode head) { // - for null

LeetCode -- 推断链表中是否有环

思路: 使用两个节点.slow和fast,分别行进1步和2步.假设有相交的情况,slow和fast必定相遇:假设没有相交的情况,那么slow或fast必定有一个为null 相遇时有两种可能:1. 仅仅是节点相交的情况,即:slow == fast可是 slow.next != fast.next2. 链表中存在环,即slow == fast 并且 slow.next == next 实现代码: public bool HasCycle(ListNode head) { // - for null

判断单链表中是否有环(循环链表)

有环的定义:链表的尾结点指向了链表中的某个结点,如下图所示 判断是否有环,两种方法: 方法1:使用p.q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点看p走的步数和q是否一样,如上图所示:当p从6走到3时,共走了6步,此时若q从出发,则q只需要走两步就到达3的位置,因而步数不相等,出现矛盾,存在环. 方法2:快慢指针,定义p.q两个指针,p指针每次向前走一步,q每次向前走两步,若在某个时刻出现 p == q,则存在环. 具体代码实现: 1 #include<stdio.h> 2 #

如何判断链表中是否有环

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

判断单向链表中是否有环和查找环的入口

快慢指针 算法描述 定义两个指针slow, fast.slow指针一次走1个结点,fast指针一次走2个结点.如果链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast).如果没有环,则快指针会第一个走到NULL. 实现 结点定义如下: class Node { public Node next; public Object data; public static int sequence = 0; } 算法: /** * 快慢指针 * @param head * @ret

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

快慢指针 算法描写叙述 定义两个指针slow, fast. slow指针一次走1个结点,fast指针一次走2个结点.假设链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast).假设没有环,则快指针会第一个走到NULL. 实现 结点定义例如以下: class Node { public Node next; public Object data; public static int sequence = 0; } 算法: /** * 快慢指针 * @param head *

剑指offer——判断链表中是否有环

题目链接:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路: //左神讲的 //先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发 //fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇 //此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), //这次两个指针一次走一步,相遇的地方就是入口节点. //这个定理可以自己去网上看看证明. 1 /* 2 public class ListNode {