考察的知识点:遍历链表、修改节点的指针指向;

解答方法分析:

  1. 首先,判断链表是否为空或者只有一个节点,如果是,则直接返回 false,表示不存在环。
  2. 初始化两个指针 slow 和 fast,初始时都指向链表的头节点。
  3. 使用一个 while 循环,判断条件为 fast != nullptr 和 fast->next nullptr,即快指针 fast 还能往前移动两个节点。循环的目的是找到链表中的环或到达链表的末尾。
  4. 在循环中,每次将 slow 指针向前移动一个节点,将fast` 指针向前移动两个节点。这样,快指针的速度是慢指针的两倍。
  5. 在每次移动后,检 slow 和 fast指向同一个节点,即slow == fast`。如果是,表示存在环,返回 true。
  6. 如果循环结束后,快指针 fast 到达链表的末尾,即 fast == nullptr 或者 fast->next == nullptr,表示链表无,返回 false。

所用编程语言:C++;

完整编程代码:↓

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return bool布尔型
     */
    bool hasCycle(ListNode* head) {
        if (head == nullptr || head->next == nullptr)
            return false;

        ListNode* slow = head;
        ListNode* fast = head;

        while (fast != nullptr && fast->next->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;

            if (slow->val == fast->val) {
                return true;
            }
        }

        return false;
    }
};