Java常见算法---弗洛伊德算法(环的相关判断)

本文介绍了使用弗洛伊德算法判断链表是否存在环及找到环入口的方法。通过设置快慢指针,当它们在链表中相遇时,可以确定存在环。若要找到环的入口,引入第三个指针,当快慢指针相遇后,该指针从头结点开始与慢指针同步前进,最终会相遇在环的入口处。这种算法同样适用于数组中的环状结构,如寻找重复数字。
摘要由CSDN通过智能技术生成

Java常见算法---弗洛伊德算法(环的相关判断)

弗洛伊德算法

1. 判断是否有环

定义快慢指针,快指针每次走两步,慢指针每次走一步,如果快指针走到了链表的结尾都没有相遇,则无环;如果快慢指针在链表的除了头结点的地方相遇了,则证明有环。

public ListNode hasCycle(ListNode head) {
    // 只有一个节点
    if (head == null || head.next == null) return false;
    // 定义快慢指针
    ListNode fast = head, slow = head;
    // 快指针速度是慢指针二倍
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        // 如果在链表某处相遇
        if (fast == slow) return true;
    }
    // 快指针走到链表结尾,返回false
    return false;
}

2. 判断环的入口在哪

快慢指针会在环内相遇,那么如何找到环的入口呢?
在这里需要定义第三个指针finder。当快慢指针在环内相遇时,helper指针从链表头开始和slow指针一起走,当helper指针和slow指针相遇时,即为环的入口。
为什么helper与slow一定能在环的入口处相遇?
在这里插入图片描述
我们首先假设:从链表到环的入口长度为m,当快慢指针相遇时,慢指针走了n步,则快指针走了2n步。现在我们单独看环内。
在这里插入图片描述

在环内,快指针走了2n-m步,慢指针走了n-m步。快指针比慢指针多走了2n-m-(n-m) = n步。从图中我们可以看到,这个n,实际上就是环的周长的倍数。即如果指针站在入口,走n步,一定还是回到原点,即还在入口处。
此时,慢指针从入口进,走了n-m步,因此,再走m步,慢指针能回到入口处。而这个m刚好就是链表从头结点到环入口的长度。因此,当快慢指针相遇时,定义一个helper指针和slow指针一起走,走m步,helper指针和slow指针就在环的入口处相遇了。
模板题 [LeetCode]287. 寻找重复数(java实现)

class Solution {
    public int findDuplicate(int[] nums) {
        int fast = 0, slow = 0;
        while(true) {
            fast = nums[nums[fast]];
            slow = nums[slow];
            if(slow == fast) {
                fast = 0;
                while(nums[slow] != nums[fast]) {
                    fast = nums[fast];
                    slow = nums[slow];
                }
                return nums[slow];
            }
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值