经典题型,使用双指针法。一个快指针,一个慢指针,两指针最初都指向头结点,快指针一次走两步,慢指针一次走一步。若存在环,则两个指针最后一定会走到一个结点上。
/**
* 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* fast = head;
ListNode* slow = head;
if(head == NULL){
return false;
}
if(head->next == NULL){
return false;
}
fast = fast->next->next;
slow = slow->next;
while(fast != NULL && slow != NULL){
if(fast == slow){
return true;
}
slow = slow->next;
if(fast->next != NULL){
fast = fast->next->next;
}else{
return false;
}
}
return false;
}
}; 这里需要注意两个需要特殊处理的情况。一是空链表,直接返回false。二是单结点无环,直接返回false。 还有一点需要注意的是,在编程时容易将第一次移动结点写在循环中,这样容易出错,建议将第一次移动结点在循环外完成。

京公网安备 11010502036488号