判圈法
判圈法
Floyd判圈法
利用快慢指针,快指针步进速度为慢指针的两倍,若是链表中存在环,则两个指针一定会相遇,且快指针路程比慢指针路程多圈长度的整数倍。
假设两个指针在
- 快指针:
- 慢指针:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class Solution {
public:
static bool hasCycle(ListNode *head) {
if (head == nullptr || head->next == nullptr) {
return false;
}
ListNode *low = head;
ListNode *fast = head->next;
while (fast != nullptr) {
if (fast == low) {
return true;
}
if (fast->next == nullptr) {
return false;
}
fast = fast->next->next;
low = low->next;
}
return false;
}
};
在验证存在环的前提下,令快指针不动,慢指针向后遍历节点,再次和快指针相等时,慢指针的步数即为环的长度。
在验证存在环的前提下,令慢指针回到起点,两个指针以相同速度步进,再次相遇时相遇点即为环起点。
上文已证明
Brent判圈法
令快慢指针指向起始节点,慢指针保持不动,快指针走
第
轮存在环的条件是,环长度 ;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 科海拾零!