题目讲解
题目来源:力扣(LeetCode)
题目难度:简单
题目链接:判断链表是否有环
题目👇
🤔解题思路:利用快慢指针法,快指针走两步,慢指针走一步,如果有环,快指针与慢指针会相遇
假设如果没有环的情况
第一种情况:链表为奇数个
第二种情况:链表为偶数个
当链表为奇数时while循环结束的条件是:fast->next == NULL
当链表为偶数时while循环结束的条件是:fast == NULL
当链表为奇数时
当链表为偶数时
此时还没开始移动
移动第一次时
移动第二次时
假设如果有环的情况
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
bool hasCycle(struct ListNode *head) {
Node*fast=head;
Node*slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
return true;
}
}
return false;
}
👇循环条件的解释
我相信大家看完代码后应该有个疑惑,为啥不把循环条件写成这样吧while(fast&&fast->next)
,如果写成这样会发现会出问题,因为当如果没有环的情况下,当链表个数为偶数的时候fast会走向空,那么fast->next,就变成了空指针指向next,就会出问题,如果把循环条件写成这样while(fast&&fast->next)
,当链表个数为偶数的时,fast为NULL,循环结束,当链表为奇数时,此时fast走向最后一个节点,fast不为NULL,fast->next为NULL,循环结束