题目描述
题目链接:141. 环形链表 - 力扣(LeetCode)
题目分析
我们先了解一个知识:循环链表
尾结点不指向NULL,指向头就是循环链表
那么带环链表就意味着尾结点的next可以指向链表的任意一个结点,甚至可以指向他自己
这里我们的算法思路唯一靠谱的还是快慢指针
slow一次走一步,fast一次走两步,当slow走到中间的时候,fast一定入环了,如果fast指向NULL,则该链表无环
当slow再走一半也就入环了,这个时候,由于slow走的慢,fast走的快,所以fast和slow最终会相遇的
那我们的代码就应该是
如果fast或者fast->next为NULL则返回false
当fast或者fast->next不为NULL的时候,slow走一步,fast走两步,当fast==slow,则返回true
代码示例
根据思路我们就可以写代码了:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode *fast=head,*slow=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
当然结果也通过了