满难度系数
* * * * *
,此题难度系数* *
。
满考频热度* * * * *
,此题热度* * * * *
。
1. 题目描述
2. 题目链接
- 牛客题目链接判断链表中是否有环
3. 题目剖析
- 一种可能时链表没环,遍历时会走到nullptr。
- 另一种情况是链表有环,遍历时不会走到nullptr,定义一个fast指针和slow指针。
当fast和slow进环以6就会围着环同时运动,且fast比slow每次多走一步。直到fast和slow相遇
。
- fast每次走
两步
,即fast=fast->next->next
; - slow每次走
一步
,即slow=slow->next
;
3.1剖析图示
3.2 图示详解
- fast和slow初始为head。
- 情况一 如果没环则fast肯定会走到nullptr。
- 情况二 如果有环,当fast和slow同时进环时就会围着环同时运动,且fast比slow每次多走一步。就变成了追逐问题,直到fast和slow相遇。
4. 解题代码
/**
* 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) {
//注释1
if(head == NULL)
{
return false;
}
//注释2
struct ListNode *fast = head;
struct ListNode *slow = head;
//注释3
while(fast && fast->next)
{
fast = fast ->next ->next;
slow = slow ->next;
if(fast == slow)
{
return true;
}
}
return false;
}
};
5. 代码注释详解
- 注释1:先对头指针进行判空。以免造成空指针访问。
- 注释2:定义好fast和slow指针且同时指向head。
- 注释3:对链表进行遍历,
while(fast && fast->next)
中fast->next判空
是为了避免while循环中fast =fast ->next
->next造成空指针访问。
1.如有错误或者没能理解的地方,请及时评论或者私信,及时修改更新
。
2.会持续更新相关链表高频题目,分类专栏—数据结构
。