判断带头结点的单链表是否有环(c语言)
时间: 2024-12-29 16:31:54 浏览: 10
判断单链表是否存在环的一种常见方法是使用快慢指针法,也称为“龟兔赛跑”算法。在C语言中,可以创建两个指针,一个普通指针每次移动一步,另一个快速指针每次移动两步。如果链表中有环,那么快速指针最终会追上普通指针;如果没有环,则快速指针会在头节点之后为空。
以下是基本的步骤:
1. 初始化两个指针 `slow` 和 `fast`,分别指向链表的头节点。
2. 循环遍历链表,直到其中一个指针到达链表尾部:
- 普通指针 `slow` 每次向前移动一步。
- 快速指针 `fast` 每次向前移动两步。
3. 如果 `fast` 指针到达了 `null` 或者 `end`(表示链表结束),说明链表没有环,返回 `false`。
4. 否则,如果 `fast` 指针追上了 `slow` 指针,说明链表存在环,返回 `true`。
下面是一个简单的伪代码示例:
```c
bool hasCycle(ListNode* head) {
if (head == nullptr || head->next == nullptr) return false;
ListNode* slow = head;
ListNode* fast = head->next;
while (slow != fast) {
if (fast == nullptr || fast->next == nullptr) return false; // 如果fast到了头,没有环
slow = slow->next;
fast = fast->next->next; // 快速指针前进两步
}
return true; // 找到环,返回true
}
```
阅读全文