【问题标题】:What if we change the number of hops of slow and fast pointer while finding the loop in a linked list如果我们在链表中查找循环时改变慢速和快速指针的跳数会怎样
【发布时间】:2014-07-02 09:07:52
【问题描述】:

要在链表中找到循环,我们只需使用两个指针slow and fast。

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 个节点,会有什么影响......

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

【问题讨论】:

  • 请注意,您的伪代码是一个无限循环,因为它总是从head 开始,并且它从不处理给定列表不是循环的情况(有没有列表结束检查)。
  • @FrerichRaabev ...修改了伪代码....现在请给出我的答案。
  • 慢和快仍然总是从头开始,所以在每次迭代中它们都有相同的值,所以它仍然是无限循环。此外,如果head-&gt;next 为空,则在尝试获取fast 的值时,由于取消引用空指针而导致崩溃。
  • @DarthHunterix ....哦哦哦...我只是粗略地写了这段代码...我不想进入代码的正确性...我只是想理解这个概念。 .. 将跃点更改为慢速和快速是否会产生负面影响。

标签: c data-structures linked-list


【解决方案1】:

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

节点数要么是奇数,要么是偶数。所以

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

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

  1. (偶数,奇数)慢移动 2,快移动 3 :在 A 和 B 的情况下都被捕获。因为如果 A 快速将继续返回到选定的节点(每三个节点),而slow 会交替变化。

  2. (odd, even)slow move by 3 and fast by 4 : 它在 A 和 B 的情况下都被捕获。因为在情况下 A 快速将继续回到每四个节点并且每三分之一变慢。这样他们应该在循环中的第 12 位发生碰撞。

  3. (odd,odd)slow move by 1 and fast by 3 : 在 A 和 B 的情况下都被捕获。两者的 GCD 都是 3,所以他们应该在即将到来的第 3 个节点从他们开始相遇.

  4. (even, even)slow move by 2 and fast by 4 : 在 A 和 B 两种情况下都被捕获。原因相同。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 2015-10-02
    • 2023-03-23
    • 1970-01-01
    • 2021-08-04
    • 2015-08-22
    • 2021-07-14
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多