判断链表中是否有环
图解:
链接
思路:
1.进行特殊情况判断:如果链表为空,那么肯定是没有环的
2.设置两个快慢指针fast和slow,fast指针每次走两个节点,slow指针每次走一个节点
3.如果没有环,那么fast最后肯定会走到NULL
4.否则fast和slow指针最后肯定是会相遇的
代码:
/**
* 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) {
//判断特殊的情况:如果是一个空表,那么肯定是没有环的,返回false
if(head==NULL){
return false;
}
//设置两个指针:slow和fast,都赋值为头结点,fast指针每次走两个节点,slow指针每次走一步
//分为两种情况:如果fast指针走的两个节点中有是NULL的,那么就表示肯定是没有环的,因为只有无环的链表的最后一个节点是能指向NULLd的;否则如果有环,那么最后两个指针肯定是会相遇的
ListNode *fast=head;
ListNode *slow=head;
while(fast!=NULL&&fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
if(fast==slow){
return true;
}
}
return false;
}
};