经典环形链表的思路和结论

发布于:2022-12-02 ⋅ 阅读:(679) ⋅ 点赞:(0)

以题引理

题·一

思路·快慢指针

在这里插入图片描述

class Solution {
public:
    bool hasCycle(ListNode *head) {
        struct ListNode* slow,*fast=head;
        while(fast && fast->next) {
            slow=slow->next;
            fast=fast->next->next;
            if(slow ==fast) {
                return true;
            }
        }
        return false;
    }
};

提升·延申

证明·1

  1. 条件:slow指针和fast指针同时从链表的开始位置出发,slow每次走一步,fast每次走两步。为什么slow和fast一定会在环中相遇?会不会在环里面错过,永远遇不上?请证明一下结论
    • 结论:他们一定会相遇。

在这里插入图片描述

证明·2

  1. 为什么slow走一步,fast走的两步呢?能不能fast走一次走n步(n>2)?请证明一下结论
    • 结论:fast一次走n步?n>2不一定会相遇。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

题目·二

在这里插入图片描述

结论·入口相遇定理【自己瞎起的】

  • 让一个指针从列表起始位置开始遍历链表。同时让一个指针从判环相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

证明·结论

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到