计算环形链表中环的长度用c++
时间: 2024-09-25 19:11:13 浏览: 55
在C++中计算环形链表中环的长度,通常可以采用“快慢指针”(Floyd's Cycle Detection Algorithm)的方法。这种方法利用两个指针,一个移动一步,另一个移动两步,如果存在环,则最终它们会在环内相遇。相遇点到链表头的距离就是环的长度。
以下是基本步骤:
1. 首先初始化两个指针`slow`和`fast`,分别指向链表的头节点。
2. 如果链表不是环形的,`fast`会先到达`nullptr`,这时返回0,表示无环。
3. 否则,当`fast`遇到`slow`时,说明找到了环,此时记录下`fast`的位置。
4. 将`slow`重新设回链表头,然后同时移动`slow`和`fast`,每次`slow`走一步,`fast`走两步,直到它们再次相遇。
5. 此时,`slow`距离环的起点就是环的长度,因为`fast`比`slow`多走了整个环的一圈。
这里是简单的C++代码示例:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* detectCycle(ListNode* head) {
if (head == nullptr || head->next == nullptr) return nullptr; // 检查是否有环
ListNode slow(*head);
ListNode fast(*head);
while (fast != nullptr && fast->next != nullptr) {
slow = slow.next;
fast = fast.next->next;
if (slow == fast) { // 找到了环
slow = head; // 将slow重新置回到头
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return &slow; // 返回环的起点
}
}
return nullptr; // 不存在环
}
int main() {
// 测试代码
ListNode* ringHead = ... // 环形链表头节点
ListNode* result = detectCycle(ringHead);
if (result) {
cout << "环的长度是: " << distance(head, result) << endl; // 使用distance函数计算长度
} else {
cout << "链表中没有环" << endl;
}
return 0;
}
```
阅读全文