经典题型,使用双指针法。一个快指针,一个慢指针,两指针最初都指向头结点,快指针一次走两步,慢指针一次走一步。若存在环,则两个指针最后一定会走到一个结点上。
/** * 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。
还有一点需要注意的是,在编程时容易将第一次移动结点写在循环中,这样容易出错,建议将第一次移动结点在循环外完成。