【每日算法 数据结构(C++)】—— 05 | 判断单链表是否有环(解题思路、流程图、代码片段)

news2024/11/18 10:25:22

文章目录

  • 01 | 👑 题目描述
  • 02 | 🔋 解题思路
  • 03 | 🧢 代码片段

在这里插入图片描述

The future belongs to those who believe in the beauty of their dreams.

未来属于那些相信梦想之美的人

01 | 👑 题目描述

给你一个单链表,请判断其中是否存在环

单链表是一种常见的数据结构,用于存储和组织数据元素。它由一系列节点(Node)组成,每个节点包含一个数据元素和一个指向下一个节点的指针(通常称为next指针)。

单链表的特点是每个节点只能访问其后继节点,而无法直接访问前驱节点或任意位置的节点。链表的头节点即为链表的入口点,尾节点的next指针为空(或指向null),表示到达了链表的末尾。

以下是一个简单的单链表示例:

Head -> Node1 -> Node2 -> Node3 -> ... -> NodeN -> null

在这个示例中,Head是链表的头节点,Node1Node2Node3等分别是链表中的节点,最后的null表示链表结束。

单链表的插入和删除操作相对灵活,可以在常数时间(O(1))内进行。但是,由于单链表无法直接访问前驱节点,如果需要在链表中查找、删除或修改某个节点,通常需要从头节点开始遍历链表,直到找到目标节点。

单链表具有动态性和节省空间的优势。由于节点在内存中可以不连续存储,因此可以根据需要动态地分配和释放节点空间,有效利用内存资源。

判断单链表是否有环是指判断链表中是否存在一个循环,即链表中某个节点的 next 指针指向之前已经出现过的节点,形成一个环状结构

02 | 🔋 解题思路

常见的判断单链表是否有环的方法是使用快慢指针双指针)的方法
具体步骤如下

  1. 定义两个指针,一个慢指针和一个快指针,初始时都指向链表的头节点。
  2. 慢指针每次移动一步,快指针每次移动两步。
  3. 如果链表中不存在环,则快指针会先到达链表的尾部(即指向空节点),此时可以判断链表无环。
  4. 如果链表中存在环,那么快指针最终会追上慢指针,二者会相遇。
  5. 如果在遍历过程中出现了相遇,则可以判断链表有环。

原理
当链表中存在环时,快指针每次移动两步,而慢指针每次移动一步,快指针相对于慢指针的速度差是1步。假设链表中的环有n个节点,当慢指针进入环后,快指针与慢指针之间的距离会逐渐减小,直到最终相遇。而快指针每次移动两步,所以最终一定会追上慢指针。
下面是一个示例:

1 -> 2 -> 3 -> 4 -> 5 -> 2   (存在环)

在这个示例中,链表中的节点2被重复访问,形成了一个环。使用快慢指针法时,快指针会先进入环(比如指向节点4),而慢指针稍后也会进入环。最终,快指针会追上慢指针,二者在节点2相遇。

因此,通过这种方法可以判断一个单链表是否有环。如果两个指针相遇,则链表有环;如果快指针先到达链表尾部(即指向空节点),则链表无环。

时间 && 空间复杂度

  • 时间复杂度O(n),其中 n 是链表中节点的个数
    • 快指针每次移动两步,慢指针每次移动一步,当链表中不存在环时,快指针会先到达链表末尾(null),此时需要遍历 n/2 个节点。
    • 当链表中存在环时,快指针会在环内循环前进,直到追上慢指针。这个过程最多需要遍历环的长度 k(环中节点的个数)。
    • 因此,算法的时间复杂度为 O(n + k),其中 n 是链表中节点的个数,k 是环中节点的个数。
  • 空间复杂度O(1)
    因为只使用了常数级别的额外空间来存储慢指针和快指针

03 | 🧢 代码片段

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

bool hasCycle(ListNode* head) {
    if (head == nullptr || head->next == nullptr) {
        return false;  // 空链表或只有一个节点的链表肯定没有环
    }
    
    ListNode* slow = head;  // 慢指针
    ListNode* fast = head;  // 快指针
    
    while (fast && fast->next) {
        slow = slow->next;          // 慢指针每次向后移动一步
        fast = fast->next->next;    // 快指针每次向后移动两步
        
        if (slow == fast) {
            return true;  // 快慢指针相遇,说明链表有环
        }
    }
    
    return false;  // 快指针到达链表末尾,说明链表无环
}

int main() {
    // 创建一个有环的链表
    ListNode* head = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);
    ListNode* node4 = new ListNode(4);
    ListNode* node5 = new ListNode(5);

    head->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;
    node5->next = node2;  // 环的入口在节点2

    // 判断链表是否有环
    bool hasCycleFlag = hasCycle(head);
    
    if (hasCycleFlag) {
        cout << "链表有环" << endl;
    } else {
        cout << "链表无环" << endl;
    }
    
    // 释放链表内存
    delete head;
    delete node2;
    delete node3;
    delete node4;
    delete node5;

    return 0;
}

在这里插入图片描述

在这里插入图片描述

各位大佬点点关注,点赞,收藏,有空的时候再回来看看,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac(M1)上安装Ubuntu虚拟机

Mac&#xff08;M1&#xff09;上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

黑马程序员前端 Vue3 小兔鲜电商项目——(十一)支付页

文章目录 基础数据渲染封装接口数据渲染 支付功能实现支付携带参数支付宝沙箱账号信息 支付结果页展示模版代码绑定路由渲染数据 倒计时逻辑函数封装 支付页有俩个关键数据&#xff0c;一个是要支付的钱数&#xff0c;一个是倒计时数据&#xff08;超时不支付商品释放)。 基础…

Tomcat项目更新Tomcat版本,重新配置conf,并在Idea运行项目,服务器替换SSL证书

Tomcat项目更新Tomcat版本&#xff0c;重新配置conf&#xff0c;并在Idea运行项目 1.下载Tomcat包2.Tomcat配置-ssi配置3.Idea运行 Tomcat 项目4.服务器Tomcat替换SSL证书4. Tomcat 项目重启 1.下载Tomcat包 Tomcat 官网 - https://tomcat.apache.org/ jdk1.8.0_191 我选择的…

如何在电脑、手机《酷游链接》录制屏幕?一看就会!也有剪辑录制视频的方法哦!

最近&#xff0c;我的生活中出现了许多需要录制电脑屏幕的场景&#xff01; 『酷游链kw9㍠N͜E͜T提供』娜娜友善提醒&#xff0c;要自己输入才会显示出来&#xff01;比如会议&#xff0c;教学等场景。这些场景我们可以通过Windows10的内建软体来解决。另外&#xff0c;也出现…

Python小白应该怎么学习字典

1.Python 字典 字典 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。 例子:创建并打印字典 thisdict {"brand": "Porsche","model": "911","year": 1963 } pr…

MUR20100DC-ASEMI快恢复二极管MUR20100DC

编辑-Z MUR20100DC在TO-263封装里采用的2个芯片&#xff0c;其尺寸都是102MIL&#xff0c;是一款共阴极快恢复对管。MUR20100DC的浪涌电流Ifsm为200A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR20100DC采用抗冲击硅芯片材质&#xff0c;…

技术管理第二板斧建团队-沟通

一、沟通的核心原则 我认为&#xff0c;沟通是内心想法和思考逻辑的外延&#xff0c;如果你有良好的沟通能力&#xff0c;可以在整个团队中营造公开透明的信任氛围&#xff0c;让信息透明的同时&#xff0c;也让团队成员愿意发出自己的声音。 但实际情况中&#xff0c;很多人…

TypeScript 中对【函数类型】的约束使用解读

概述 函数是JavaScript 中的 一等公民 概念&#xff1a;函数类型的概念是指给函数添加类型注解&#xff0c;本质上就是给函数的参数和返回值添加类型约束 声明式函数: 在 TypeScript 中&#xff0c;一个函数有输入和输出&#xff0c;需要对其进行约束&#xff0c;需要把输入和…

电力载波远程控制系统

随着电力技术的不断发展&#xff0c;电力载波远程控制系统成为了现代电力系统中的重要组成部分。电力载波远程控制系统是一种利用电力载波技术实现远程控制的系统&#xff0c;可以对电力系统中的各种设备进行实时监测、控制和管理&#xff0c;提高电力系统的安全性、可靠性和效…

Efficient Video Transformers with Spatial-Temporal Token Selection阅读笔记

摘要 Video Transformers在主要视频识别基准测试中取得了令人印象深刻的结果&#xff0c;但其计算成本很高。 在本文中&#xff0c;我们提出了 STTS&#xff0c;这是一种令牌选择框架&#xff0c;它根据输入视频样本在时间和空间维度上动态选择一些信息丰富的令牌。 具体来说&…

Qt/C++编写视频监控系统78-视频推流到流媒体服务器

一、前言 视频推流作为独立的模块&#xff0c;目前并没有集成到视频监控系统中&#xff0c;目前是可以搭配监控系统一起使用&#xff0c;一般是将添加好的摄像头通道视频流地址打开后&#xff0c;读取视频流重新推到流媒体服务器&#xff0c;然后第三方可以从流媒体服务器拉取…

博世中国×牛客:精准人才简历增长100%!智能制造大揭秘

当一家智能制造巨头&#xff0c;在面向人工物联网企业的全面转型中&#xff0c;人才需求发生变化&#xff0c;年轻的校园顶尖科技人才成为刚需。 此时&#xff0c;内部需求激增&#xff0c;人才要求高还翻倍增长&#xff0c;但外部供需失衡&#xff0c;人才供给极少。尽管已然…

编译原理二:有限状态机

文章目录 1. 有限状态机介绍1.1. 确定性有限状态机&#xff08;DFA&#xff09;1.2. 非确定性有限状态机&#xff08;NFA&#xff09;1.3. 有限状态机的应用 2. 例子&#xff1a;实现一个简易版本的分词 1. 有限状态机介绍 有限状态机是一种计算模型&#xff0c;它可以接受一串…

脑机接口科普0023——黑门03:伦理道德中的电车难题

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 脑机接口科普0022——黑门02&#xff1a;伦理道德问题_sgmcy的博客-CSDN博客 前文中&#xff0c;罗列了一下脑机接口这个技术中&#xff0c;会遇到哪些伦理道德的问题。 前文末&#xff0c;以黑门…

Stable Diffusion 对图像进行风格化

风格化是基于现有图像转换成另一种风格的操作方法&#xff0c;通常应用于img2img中&#xff0c;将文字提示中特定的新风格应用于原图像上进行修改。在这个过程中并非使用随机的潜在状态&#xff0c;而是采用原始图像去编码初始潜在状态。在此基础上通过加入少量的随机性&#x…

【观察】新华三:数据中心可组合架构创新,提供多元算力的“最优解”

今天&#xff0c;以ChatGPT为代表的AIGC大模型&#xff0c;已经在国内形成了“海啸效应”&#xff0c;几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力&#xff0c;就在于大模型的最大价值在于普遍提升个人生产力&#xff0c;而各行各业的公司都在积极寻找应…

linux下照片添加水印乱码

java程序给图片添加中文文字水印显示乱码 原因&#xff1a;linux服务器没有对应的文字 解决步骤 在windows系统下文字中选一个文字&#xff08;微软雅黑&#xff09; windows文字保存路径&#xff1a;C:\Windows\Fonts 上传到linux服务器&#xff1a;/usr/share/fonts 新建…

Revit做基坑放坡开挖方法及快速生成基坑

一、Revit做基坑放坡开挖方法 1、建立基坑顶与基坑底轮廓参照线&#xff0c;使用地形表面工具通过放置点创建原始平整场地过后的地形(有坐标点可以直接导入)。 2、修改原始地形名称为&#xff1a;开挖前&#xff0c;阶段化&#xff1a;现有类型。 3、使用平整区域&#xff0c;弹…

video-从入门到精通-不管任何项目奇葩需求,这一专栏就够了

在日常我们的开发中&#xff0c;我们会遇到类似这样的功能&#xff0c;视频播放了这种情况&#xff0c;但是如果只是简单的实现的话&#xff0c;ui不满意&#xff0c;因为&#xff0c;别人有的&#xff0c;就是代表这是能实现的&#xff0c;你必须完成&#xff08;苦der程序员&…

享趣闻 | 神秘感十足的5个博物馆,其中一个还是在水上?

大家好&#xff0c;此po是乐于分享的建模助手。 小编发现&#xff0c;在日常的推文里&#xff0c;除了BIM插件相关的推送深受各位喜爱之外&#xff0c;一些建筑行业相关的文章热度也蛮高的。 那本期咱们就来聊聊博物馆。 博物馆是一个能直接感受历史和文明的地方&#xff0c;一…