蓝桥与力扣刷题(141 环形链表)

news2025/2/5 6:10:51

题目:给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

第一种解题思路+代码:(快慢指针)

代码:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        /**
        思路:
        1.判断链表是否为空或者单链表,是直接返回false
        2.声明快慢指针,遍历链表(快指针速度为一次两步,慢指针速度为一次一步)
        3.当快慢指针相遇时,可以判断出该链表存在环
        4.此时需要将一个指针重新指向链表的头节点
        5.快慢指针同时移动,每次各移动一步,终会在环的入口处相遇
         */

         if(head == null || head.next == null){
            return false;
         }

        ListNode slowNode = head;
        ListNode fastNode = head;

        //遍历链表(快指针速度为一次两步,慢指针速度为一次一步)
         while(fastNode != null && fastNode.next != null){
            slowNode = slowNode.next;
            fastNode = fastNode.next.next;

            //快慢指针相遇时,该链表存在环
            if(slowNode == fastNode){
                //将一个指针重新指向链表的头节点
                slowNode = head;
                while(slowNode != fastNode){
                    //快慢指针同时移动,每次各移动一步(是在判断链表存在环之后的快慢指针)
                    slowNode = slowNode.next;
                    fastNode = fastNode.next;
                }
            return true;
            }
         }
         return false;
    }
}

这道题在我解答之后去看了官网和一些大佬的题解,有对快慢指针来判断是否为环形链表相应的图解(作者:Caddy  题解:https://leetcode.cn/problems/linked-list-cycle/solutions/691164/yuan-lai-hui-luo-ji-qing-xi-jian-dan-yi-7o8tx/)

举例一
小汽车和自行车从跑道的起点同时出发
如果没有环道,那么小汽车永远离自行车而去
如果有环道,最终小汽车最终会追上自行车
举例二
大家初高中时候,学校操场的环形跑道上举行万米长跑,跑的快的学生经常会追上跑的慢的学生,也就是跑的快的学生第一次追上跑的慢的学生的时候,实际跑的快的学生比跑的慢的学生多跑了一圈。

第二种解题思路+代码:(哈希表)引用力扣(作者:数据结构和算法  题解:https://leetcode.cn/problems/linked-list-cycle/solutions/438358/3chong-jie-jue-fang-shi-liang-chong-ji-bai-liao-10/)在该篇题解中,作者编写多种方法来解答环形链表,除了快慢指针和哈希表,还有反转链表和链表节点逐个删除的方法,对我而言大佬的多种解法帮我扩充了知识面(大家有兴趣也可以去搜索)。

代码:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
   public boolean hasCycle(ListNode head) {
    //链表中存在环,那么在遍历链表的过程中,某个节点会重复出现。通过将每个节点添加到哈希集合中,如果某个节点已经存在于集合中,说明链表存在环。
    Set<ListNode> set = new HashSet<>();
    while (head != null) {
        //如果重复出现说明有环
        if (set.contains(head))
            return true;
        //否则就把当前节点加入到集合中
        set.add(head);
        head = head.next;
    }
    return false;
    }
}

总结:解答该题所用的快慢指针法只要存在速度差,在移动n次后快慢指针也终会相遇。因此,快慢指针的速度不限定是在2倍之差。另外,在写这道题时,我也苦恼了很久,在使用快慢指针遍历链表确实能够判断出该链表是否存在环,但是如何确定链尾连接到链表中的位置,并返回相应的下标?后面我查询AI时,AI给出了相应的解释:假设链表的起点到环的入口的距离为 x,环的长度为 y。当快慢指针第一次相遇时,慢指针走了 x+y 的距离,而快指针走了 x+2y 的距离(因为快指针比慢指针多走了一圈)。当我们将一个指针重新指向链表的头节点,并让两个指针同时移动时,它们会在环的入口相遇。这是因为:从链表起点到环的入口的距离是 x。从相遇点到环的入口的距离也是 x(因为快指针在环中多走了一圈,所以它在环中走的距离是 y,而从相遇点到环的入口的距离正好是 x)

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

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

相关文章

【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)

1、注册物联网云平台&#xff0c;这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序&#xff08;需要引用巴法云库文件&#xff09;&#xff0c;程序中订阅“ledtest”主题&#xff0c;用于接收单片机发送来的数据。此处会将连接的温度传感器…

图论常见算法

图论常见算法 算法prim算法Dijkstra算法 用途最小生成树&#xff08;MST&#xff09;&#xff1a;最短路径&#xff1a;拓扑排序&#xff1a;关键路径&#xff1a; 算法用途适用条件时间复杂度Kruskal最小生成树无向图&#xff08;稀疏图&#xff09;O(E log E)Prim最小生成树无…

BUU16 [ACTF2020 新生赛]BackupFile1

扫到index.php.bak 实在扫不出来可以试试一些常有的文件&#xff0c;比如flag.php&#xff08;flag.php.bak&#xff09;&#xff0c;index.php&#xff08;index.php.bak&#xff09; <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key…

运维之MySQL锁机制(MySQL Lock Mechanism for Operation and Maintenance)

运维之MySQL锁机制 锁是一种常见的并发事务的控制方式。MySQL数据库中的锁机制主要用于控制对数据的并发访问&#xff0c;防止多个用户或进程同时对同一数据进行读写操作&#xff0c;从而避免数据不一致和丢失更新等问题。锁机制确保数据的一致性&#xff0c;保证在多个事务操作…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用&#xff0c;组成应用的服务可能很多&#xff0c;使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理&#xff0c;此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构&#xff1a; chart:一个应用的信息集合…

MyBatis-Plus速成指南:通用枚举 多数据源

通用枚举&#xff1a; 概述&#xff1a; 表中有些字段值是固定的&#xff0c;例如性别(男或女)&#xff0c;此时我们可以使用 MyBatis-Plus 的通用枚举来实现 数据库表添加字段&#xff1a; 创建通用枚举类型&#xff1a; Getter public enum SexEnum {MALE(1, "男"…

Android项目中使用Eclipse导出jar文件

2014年3月24日 天气晴朗 关于打包Android组件肯定是有用到的&#xff0c;比如开发了一个模块&#xff0c;为了更好的复用&#xff0c;我们可能会将它打包成jar文件方便其他项目引用。这个很好理解&#xff0c;也很简单。网上有一堆关于用Eclipse将Android项目打包成jar文件的&…

网络安全学习 day4

防火墙的安全策略 规则--策略 条件 --- 检查报文的依据&#xff0c;防火墙将报文中携带的信息与条件逐一进行对比&#xff0c; 以此来判断报文是否是 匹配的 。不同的匹配条件之间属于 “ 与 ” 关系&#xff1b;相同的匹配条件中不同的参数信息之间的关系为 “ 或 ” 关系。…

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制

内容概要 在当前快速发展的城市环境中&#xff0c;智慧园区综合管理系统正在成为各类园区管理的重要工具&#xff0c;无论是工业园、产业园、物流园&#xff0c;还是写字楼与公寓&#xff0c;都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统&#xff0c;用…

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络&#xff08;NTN&#xff09;中&#xff0c;卫星的高速移动性和广域覆盖特性使得地面设备&#xff08;UE&#xff09;需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息&#xff0c;SystemInformationBlockType33&#x…

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

【Envi遥感图像处理】010:归一化植被指数NDVI计算方法

文章目录 一、NDVI简介二、NDVI计算方法1. NDVI工具2. 波段运算三、注意事项1. 计算结果为一片黑2. 计算结果超出范围一、NDVI简介 归一化植被指数,是反映农作物长势和营养信息的重要参数之一,应用于遥感影像。NDVI是通过植被在近红外波段(NIR)和红光波段(R)的反射率差异…

优选算法合集————双指针(专题二)

好久都没给大家带来算法专题啦&#xff0c;今天给大家带来滑动窗口专题的训练 题目一&#xff1a;长度最小的子数组 题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …

基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

糖化之前,为什么要进行麦芽粉碎?

糖化的目的是将麦芽中的淀粉转化为可发酵性的糖分&#xff0c;而糖化之前&#xff0c;进行麦芽粉碎是确保糖化效果的关键步骤。本文天泰将阐述麦芽粉碎的重要性及其对酿造过程的影响。 一、麦芽粉碎的目的 增加酶的作用面积&#xff1a;麦芽中的淀粉和蛋白质等物质需要通过酶…

PAT甲级1052、Linked LIst Sorting

题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…

半导体器件与物理篇6 MESFET

金属-半导体接触 MESFET与MOSFET的相同点&#xff1a;它们的电压电流特性相似。都有源漏栅三极&#xff0c;强反型&#xff0c;漏极加正向电压&#xff0c;也会经历线性区、夹断点、饱和区三个阶段。 MESFET与MOSFET的不同点&#xff1a;在器件的栅电极部分&#xff0c;MESFE…

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署&#xff0c; 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…