c++创建一个链表,计算并返回链表中环的长度,若无环则返回0
时间: 2024-10-12 15:08:08 浏览: 35
在 C++ 中创建一个链表并检测环的长度通常需要使用快慢指针(Floyd's Cycle Detection Algorithm 或者也称为龟兔赛跑算法)。以下是实现的基本步骤:
1. 初始化两个指针 `slow` 和 `fast`,都指向链表的头节点。
2. `slow` 指针每次移动一步,而 `fast` 指针每次移动两步。
3. 如果链表中存在环,那么最终 `fast` 指针会追上 `slow` 指针;如果没有环,`fast` 指针将会先到达链表的末尾(null)。
4. 当它们相遇时,说明找到了环。此时,你可以设置一个新的指针 `pointer = slow`,然后同时移动 `slow` 和 `pointer`,它们每次各自向前移动一步,直到再次相遇。这次相遇的位置就是环的入口点。
5. 计算环的长度:从环的入口开始,将 `slow` 指针和 `pointer` 指针一起向后移动,数出它们相隔的节点数,这就是环的长度。如果 `slow` 没有超过 `pointer`,说明链表中不存在环,直接返回 0。
```cpp
class ListNode {
public:
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) { // 环找到
ListNode* pointer = slow;
while (slow != pointer->next) {
slow = slow->next;
pointer = pointer->next;
}
return slow; // 返回环的入口节点
}
}
return nullptr; // 无环情况
}
```
阅读全文