/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
//为了判断链表中是否有环,我们可以使用快慢指针算法(Floyd's cycle-finding algorithm)。该算法通过使用两个指针,一个每次移动一步(慢指针),另一个每次移动两步(快指针),来检测链表中是否存在环。如果链表中存在环,快指针最终会追上慢指针;如果不存在环,快指针会先到达链表末尾(即遇到null值)。

算法步骤:
如果链表头节点为空,直接返回false。

初始化两个指针slow和fast,都指向头节点。

循环遍历链表,直到fast或fast.next为空:

慢指针每次移动一步:slow = slow.next

快指针每次移动两步:fast = fast.next.next

在移动后,如果slow和fast相遇(指向同一节点),则返回true,表示有环。

如果循环结束(即fast或fast.next为空),返回false,表示无环。

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