给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
来源:https://leetcode-cn.com/problems/linked-list-cycle
分析
- 考虑链表为空,链表为一个结点时的特殊情况
- 链表只有一个节点时,它的
next
指针会不会指向自身 - 利用快慢指针判断是否有环,链表有环时,快指针和慢指针一定会在某个结点相遇
- 当任一指针出现为空的情况都说明链表不带环
- 快指针一次走两步时,注意判断
fast-next
是否为空,防止出现使用空指针
过程如图
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* slow=head;
ListNode* fast=head;
if(head==NULL || head->next==NULL)
{
return false;
}
while(slow != NULL && fast!=NULL && fast->next!=NULL )
{
slow=slow->next;
fast=fast->next->next;
if( slow == fast)
{
return true;
}
}
return false;
}
};