/**
* 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;
}
};