Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定循环是否存在于链表中的算法_Algorithm_Loops_Linked List - Fatal编程技术网

Algorithm 确定循环是否存在于链表中的算法

Algorithm 确定循环是否存在于链表中的算法,algorithm,loops,linked-list,Algorithm,Loops,Linked List,因此,我最近遇到了一种算法来确定链表中是否存在循环。代码如下: public boolean hasCycle(ListNode head) { if (head == null) { return false; } ListNode fast = head; ListNode slow = head; while (fast != null) { if (fast.next == null) { r

因此,我最近遇到了一种算法来确定链表中是否存在循环。代码如下:

public boolean hasCycle(ListNode head) {
    if (head == null) {
        return false;
    }
    ListNode fast = head;
    ListNode slow = head;
    while (fast != null) {
        if (fast.next == null) {
            return false;
        }
        if (fast.next == slow) {
            return true;
        }
        fast = fast.next.next;
        slow = slow.next;
    }
    return false;
}
在尝试证明此算法的正确性时,我想到了一个想法: 假设循环周长为“a”,则两个指针相遇之前经过的时间为“t”。由于“快”节点的移动速度是“慢”节点的两倍,因此我们可以得到数学关系:

2t模a=t模a


现在“a”是一个常数,表示周长,“t”可以是1,2,3。。。。那么,我如何证明,无论“a”是什么值,我们总是可以找到一个“t”,这样上面的方程是可解的?

你的思路是正确的!提示:迭代后,您的公式会发生什么变化?

您的思路是正确的!提示:迭代后,公式会发生什么变化?

假设两个指针在循环内的同一点开始(这不算作会议)

2t=t(a)

=>
2t-t=0(a)

=>
t=0(a)

这意味着在t=a*k时,经过的时间是循环长度的倍数后,两个指针将在起始点相遇


对于所有
a>=2
,这是正确的,因为对于所有
k>1
,当时间等于
k*a
时,慢速指针正好运行k个周期,而快速指针运行速度快两倍,因此它运行2k个周期,它们仍然在同一点上相遇,这是起点。

假设两个指针在循环内的同一点上开始(这不算相遇)

2t=t(a)

=>
2t-t=0(a)

=>
t=0(a)

这意味着在t=a*k时,经过的时间是循环长度的倍数后,两个指针将在起始点相遇


对于所有
a>=2
,这是正确的,因为对于所有
k>1
,当时间等于
k*a
时,慢速指针正好运行k个周期,而快速指针运行速度快两倍,因此它运行2k个周期,但它们仍然在同一点(即起点)相遇。

如果循环不是从第一个节点开始,等式是否正确?例如:1->2,2->3,3->4,4->5,5->3,循环={3,4,5,3}任意
t=0模a
求解
2t=t模a
。您还需要
t>=s
,其中需要
s
步骤才能进入循环。@MattTimmermans-ummm…我想,经过一段时间的思考,可能是一样的:2t-s=t-s(a)所以2t=t(a),不确定though@shole,您需要这两个条件。如果需要13个步骤才能进入长度为10的循环,那么指针将在t=20和t=30处相遇,但不是t=10。如果循环不是从第一个节点开始,那么等式是否正确?例如:1->2,2->3,3->4,4->5,5->3,循环={3,4,5,3}任意
t=0模a
求解
2t=t模a
。您还需要
t>=s
,其中需要
s
步骤才能进入循环。@MattTimmermans-ummm…我想,经过一段时间的思考,可能是一样的:2t-s=t-s(a)所以2t=t(a),不确定though@shole,您需要这两个条件。如果进入长度为10的循环需要13个步骤,那么指针将在t=20和t=30处相遇,但不是t=10。我在你的第二步迷路了:(你怎么从2t=t(a)得到2t-t=0(a)?两边都减去t%a?我在你的第二步迷路了:(你怎么从2t=t(a)得到2t-t=0(a)?两边都减去t%a?