使用快慢指针法可高效判断链表是否存在环,时间复杂度O(n),空间复杂度O(1);通过快指针每次走两步、慢指针每次走一步,若相遇则有环,否则无环。

在C++中判断链表是否存在环,最常用的方法是快慢指针法(也叫弗洛伊德判圈算法)。这种方法效率高,时间复杂度为O(n),空间复杂度为O(1)。
使用两个指针,一个慢指针(slow)每次移动一步,一个快指针(fast)每次移动两步。如果链表中存在环,快指针最终会追上慢指针;如果没有环,快指针会到达链表末尾。
关键逻辑:以下是完整的判断链表环的C++代码示例:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
bool hasCycle(ListNode *head) {
if (!head || !head->next) return false;
ListNode *slow = head;
ListNode *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
return true; // 存在环
}
}
return false; // 无环
}
如果不仅要判断是否有环,还要找到环的起始节点,可以在检测到环后继续处理:
立即学习“C++免费学习笔记(深入)”;
ListNode *detectCycle(ListNode *head) {
ListNode *slow = head, *fast = head;
// 先判断是否有环
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) break;
}
if (!fast || !fast->next) return nullptr; // 无环
slow = head;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow; // 返回环的入口
}
以上就是c++++中如何判断链表环_c++链表环判断方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号