判断给定的链表中是否有环。如果有环则返回true,否则返回false。
题解:使用快慢指针,慢指针每次向前走一步,快指针走两步,如果两个指针相遇,则存在环,且相遇的节点一定在环中。
需要注意快指针不能一次性走两步,每走一步要判断是否为NULL
/**
* 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) {
if(head == NULL) return false; //空链表
ListNode* pSlow = head->next;
if(pSlow == NULL) return false;//只有一个节点,不可能存在环
ListNode* pFast = head->next->next;
if(pFast == NULL) return false; //只有两个节点的单链表
while(pFast != NULL && pSlow != NULL){
if(pFast == pSlow) return true;
pSlow = pSlow->next;//慢指针向前移动一步
pFast = pFast->next; //快指针需要向前移动两步
if(pFast == NULL) return false;
pFast = pFast->next;
}
return false;
}
};