一、思路
双指针
二、解题方法
使用了正确的快慢环指针方法来判断链表。快指针每次向前移动两步,慢指针每次移动一步,如果链表中向前移动一步,它们最终会相遇。如果链表不存在环,快指针会先到达链表是否存在,此时存在我们就可以判断链表没有环。同时,增加了我们对空链表的处理,避免了空指针访问。
三、code
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head || !head->next)
{
return false;// 空链表或只有一个节点的链表一定没有环
}
ListNode* fast=head;
ListNode* slow=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast == slow)
{
return true;// 快慢指针相遇,说明链表有环
}
}
return false;// 快指针到达链表末尾,没有环
}
};
=========================================================================学到的知识:
① while(fast && fast->next)里的 fast->next
如果没有这样的条件判断,当快指针已经到达链表结束时,再进行的访问操作会导致空指针引用,造成程序崩溃fast->next
②if(fast == slow)为什么不是if(fast->val == slow->val)
当链表中有环时,快指针和慢指针相遇。换句话说,两个指针都指向循环中的同一个节点。fast->val
检查这些节点(和)的值slow->val
并不能保证指针由于循环而相遇。可能存在值相同但不存在循环的其他情况。