牛客经典链表题—(NC4)判断链表中是否有环

满难度系数 * * * * *,此题难度系数 * *
满考频热度 * * * * *,此题热度 * * * * *

1. 题目描述

在这里插入图片描述

2. 题目链接

  1. 牛客题目链接判断链表中是否有环

3. 题目剖析

  1. 一种可能时链表没环,遍历时会走到nullptr。
  2. 另一种情况是链表有环,遍历时不会走到nullptr,定义一个fast指针和slow指针。当fast和slow进环以6就会围着环同时运动,且fast比slow每次多走一步。直到fast和slow相遇
  • fast每次走两步,即fast=fast->next->next;
  • slow每次走一步,即slow=slow->next;

3.1剖析图示

在这里插入图片描述

3.2 图示详解

  1. fast和slow初始为head。
  2. 情况一 如果没环则fast肯定会走到nullptr。
  3. 情况二 如果有环,当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. 注释1:先对头指针进行判空。以免造成空指针访问。
  2. 注释2:定义好fast和slow指针且同时指向head。
  3. 注释3:对链表进行遍历,while(fast && fast->next)fast->next判空是为了避免while循环中fast = fast ->next ->next造成空指针访问。

1.如有错误或者没能理解的地方,请及时评论或者私信,及时修改更新
2.会持续更新相关链表高频题目,分类专栏—数据结构

猜你喜欢

转载自blog.csdn.net/weixin_45313447/article/details/115266576