环形链表
题目描述:给定一个链表,判断链表中是否有环。
题解思路:采用双指针法,设置一个快指针,一个慢指针,它们采取的步长不一样,如果相遇,就代表链表一定存在环。
注意点:
- 小心空指针,使用
fast->next->next
要先判断fast->next
是否为空 - C99以后有bool类型: 引入头文件
#include <stdbool.h>
即可
bool hasCycle(struct ListNode *head) {
bool res=false;
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
res=true;
break;
}
}
return res;
}
另一种题解思路:采用标记法,标记访问过的节点的val值为999999(大一些,要通过全部测试实例),然后再一次访问到val值为999999的节点即为有环。
bool hasCycle(struct ListNode *head) {
bool res=false;
struct ListNode *p=head;
while(p)
{
if(p->val==9999999&&!res)
{
res=true;
break;
}
p->val=9999999;
p=p->next;
}
return res;
}