美文网首页算法代码
判断链表中是否有环

判断链表中是否有环

作者: windUtterance | 来源:发表于2020-08-13 09:04 被阅读0次

    题目描述
    给定一个链表,判断链表中是否有环。
    为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。、

    示例
    输入:head = [3,2,0,-4], pos = 1
    输出:true
    解释:链表中有一个环,其尾部连接到第二个节点。
    通过使用具有 不同速度 的快、慢两个指针遍历链表,空间复杂度可以被降低至 O(1)O(1)。慢指针每次移动一步,而快指针每次移动两步。

    如果列表中不存在环,最终快指针将会最先到达尾部,此时我们可以返回 false。

    现在考虑一个环形链表,把慢指针和快指针想象成两个在环形赛道上跑步的运动员(分别称之为慢跑者与快跑者)。而快跑者最终一定会追上慢跑者。这是为什么呢?考虑下面这种情况(记作情况 A)- 假如快跑者只落后慢跑者一步,在下一次迭代中,它们就会分别跑了一步或两步并相遇。

    其他情况又会怎样呢?例如,我们没有考虑快跑者在慢跑者之后两步或三步的情况。但其实不难想到,因为在下一次或者下下次迭代后,又会变成上面提到的情况 A。

    作者:LeetCode
    链接:https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    image

    Java代码

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
        public boolean hasCycle(ListNode head) {
            if(head == null || head.next == null) return false;
    
            ListNode fast = head.next;
            ListNode slow = head;
    
            while(slow != fast) {
                if(fast == null || fast.next == null) {
                    return false;
                }
    
                fast = fast.next.next;
                slow = slow.next;
            }
            return true;
        }
    }
    

    相关文章

      网友评论

        本文标题:判断链表中是否有环

        本文链接:https://www.haomeiwen.com/subject/rqzvdktx.html