一般思路是设置一个慢指针和一个快指针,慢指针每次移动一步,快指针每次移动两步,如果有环,则两个指针最终会相遇,否则,指针最终会指向NULL.
假设链表中有环,那么指针在其中逐个移动时,没有指向NULL的可能性,无环的链表指针才有指向NULL的可能性。注意单链表中指针只有一个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;
while(fast != NULL && fast -> next != NULL){
slow = slow -> next;
fast = fast -> next -> next;
if(slow == fast)
return true;
}
return false;
}
};
网友评论