链表 - 141. 环形链表 I(C#和C实现)
题目描述
给定一个链表,判断链表中是否有环。
进阶: 你能否不使用额外空间解决此题?
解题思路
使用快慢指针,判断链表是否有环。
- 使用两个指针
slow
和fast
,slow
每次走一步,fast
每次走两步。 - 如果链表有环,
fast
最终会追上slow
,如果链表无环,fast
会先到达链表末尾。 - 如果存在环,两个指针最终会相遇;如果不存在环,快指针会先到达链表末尾。
C#代码实现
public bool HasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true; // 链表有环
}
}
return false; // 链表无环
}
C代码实现
bool hasCycle(struct ListNode *head) {
struct ListNode *slow = head;
struct ListNode *fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
return true; // 链表有环
}
}
return false; // 链表无环
}
时间复杂度和空间复杂度
- 时间复杂度:O(n),其中 n 是链表的长度。第一次遍历检测是否有环。
- 空间复杂度:O(1)。除了常数级别的变量,算法的空间复杂度是常数级别的。
参与点评
读者朋友们,如果您在阅读过程中,对文章的质量、易理解性有任何建议,欢迎在评论区指出,我会认真改进。