为了在链表中找到一个循环,我们简单地使用两个指针。

slow = head->next;
fast = head->next->next;

    while(slow != fast)
    {
        slow = head->next;
        fast = head->next->next;
        if(!slow || !fast)
        {
            cout<<"   No Loop ";
            break;
        }
    }


这样我们可以在链表中找到循环。
现在,如果我使慢速指针跳2个节点并快速跳3个节点或慢速3个节点并快速4个节点,那将会是什么后果……

我在代码中尝试过此方法,但每次都能得到正确的结果。
有人能对此有所启发吗?另外,我立即想到的另一件事是,我们可以通过某些特殊的慢速和快速指针选择进入无限循环,但找不到一个。

最佳答案

希望数量的变化只会减少寻找周期的过程。它
不会让您陷入无限循环。


节点数将是奇数或偶数。所以


情况A:对于奇数个节点(例如3或5个节点)
情况B:
对于偶数个节点(例如2或4个节点)


参见测试示例场景:通用解决方案是:GCD(慢速运动,快速运动)将是节点在循环内及时胶体化的点。


(偶数,奇数)慢速移动2,快速移动3:在情况A和情况B中都被捕获。因为在这种情况下,快速将继续返回到所选节点(每个第三个节点),而慢速将交替变化。
(奇数,偶数)慢速移动3,快速移动4:在情况A和情况B中都被捕获。因为在这种情况下,速度A会继续回到每个第四个节点,而速度会每三个变慢。这样,他们应该在循环中到达第12位时发生碰撞。
(奇数,奇数)慢速移动1,快速移动3:在情况A和情况B中都被捕获。两者的GCD均为3,因此它们应该从开始时在即将到来的第三个节点相遇。
(偶数)慢移2和快移4:在情况A和情况B中都被捕获。相同的原因。

10-08 00:19