C++算法练习-day10——142.环状链表2

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求检测一个链表中是否存在环,并返回环的起始节点。这个问题通常被称为"链表中的环检测问题"。为了解决这个问题,我们可以使用快慢指针(也称为Floyd的循环检测算法)或者利用哈希集合(如C++中的unordered_set)来记录已经访问过的节点。这里我们选择后者,因为它相对直观且易于实现。

代码实例:

复制代码
#include <unordered_set>  
  
// 单链表节点的定义  
struct ListNode {  
    int val;  
    ListNode *next;  
    ListNode(int x) : val(x), next(NULL) {}  
};  
  
class Solution {  
public:  
    ListNode *detectCycle(ListNode *head) {  
        // 使用unordered_set来存储访问过的节点  
        unordered_set<ListNode *> ans;  
          
        // 遍历链表,直到遇到NULL或者发现重复的节点  
        while(head != NULL){  
            // 如果当前节点已经在集合中,说明有环,返回该节点  
            if(ans.count(head)){  
                return head;  
            }  
            // 将当前节点加入集合  
            ans.insert(head);  
            // 移动到下一个节点  
            head = head->next;  
        }  
        // 如果遍历完整个链表都没有发现环,返回NULL  
        return NULL;  
    }  
};

注释详解

  1. 包含头文件 :#include <unordered_set>,使用哈希集合来存储访问过的节点。
  2. 定义链表节点结构 :struct ListNode,包含一个整数值val和一个指向下一个节点的指针next。
  3. 定义解决方案类 :class Solution,包含一个公共方法detectCycle,该方法接受链表的头节点head作为参数。
  4. 创建哈希集合 :unordered_set<ListNode *> ans;,用于存储访问过的节点。
  5. 遍历链表 :使用while循环遍历链表,直到head为NULL或者发现重复的节点。
  6. 检查节点是否已访问 :if(ans.count(head)),如果当前节点已经在集合中,说明有环,返回该节点。
  7. 添加节点到集合 :ans.insert(head);,将当前节点加入集合。
  8. 移动到下一个节点 :head = head->next;,继续遍历链表。
  9. 返回结果 :如果遍历完整个链表都没有发现环,返回NULL。

知识点摘要

  • 链表:一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
  • 哈希集合:一种数据结构,可以在平均情况下实现常数时间的插入、删除和查找操作。
  • Floyd的循环检测算法:一种使用快慢指针的算法,用于检测链表中的环。
  • 循环检测:确定链表中是否存在环,并找到环的起始节点。

在这篇文章中,我们讨论了如何使用哈希集合来解决链表中的环检测问题。通过遍历链表并使用哈希集合记录访问过的节点,我们可以有效地检测链表中的环,并找到环的起始节点。这种方法简单直观,易于理解和实现。虽然Floyd的循环检测算法是另一种有效的解决方案,但使用哈希集合的方法在某些情况下可能更加直观和适合。希望这篇文章能够帮助你更好地理解和解决链表中的环检测问题。

相关推荐
像风一样的男人@14 小时前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤14 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
必须得开心呀14 小时前
字节序大小端科普
c++·程序人生
m0_6399069414 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J14 小时前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
会编程的小孩14 小时前
C++ 子集
c++
GIS数据转换器14 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts
weixin_4173968315 小时前
星级酒店境外电视频道怎么合法接入?合规要点与核对清单
开发语言·前端·php·1024程序员节·综合布线
SunkingYang15 小时前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
熊猫钓鱼>_>15 小时前
鸿蒙PC构建实战:hvigor modelVersion 降级 + schema 清理 + ArkTS 编译三连坑完整复盘
开发语言·华为·ai编程·harmonyos·openharmony·数据·ai生成