判断链表中是否有环C++实现
判断链表中是否有环
https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9
/**
* 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* fast=head;
ListNode* slow=head;
while((fast->next!=NULL)&&(fast!=NULL)){//如果链表没有环则fast必然先到末尾,不用判断slow
fast=fast->next->next;
slow=slow->next;
if(fast==slow){
return true;
}
}
return false;
}
};
问题:
- fast每次步进的步长为2,为什么在while条件中是fast->next!=NULL而不是fast->next->next!=NULL?
- 经测试,fast非的是slow的2倍速才行,3倍速4倍速都通不过为撒?
结论:
- 不管有多少个next指针,对其判非空都是只判断fast->next非空就行。
- 对于fast=fast->next配合while循环,要对循环体内所有的指针操作判非空作为终止条件。