LeetCode141.环形链表

news2024/11/25 0:38:48

141.环形链表

目录

  • 141.环形链表
    • 一、哈希表
    • 二、双指针

在这里插入图片描述

在这里插入图片描述

一、哈希表

最容易想到的方法就是遍历所有节点,每次遍历到一个节点的时候,判断该节点此前是否被访问过

我们可以使用哈希表来存储所有已经访问过的节点

每次到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入到哈希表中,重复这一操作,直到遍历完整个链表为止

值得一提的是,这里我们使用HashSet,Set集合的特点是什么?即该集合中不会出现重复的元素,如此一来,就很好判断了

    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<ListNode>();
        while(head!=null){
            //如果向哈希Set中加入节点失败(即该Set中已经有了重复的元素)
            if(!set.add(head)){
                return true;
            }
            head = head.next;
        }
        return false;
    }

二、双指针

本题的快慢指针法,需要我们先了解一下Floyd判圈算法(龟兔赛跑算法)

假设乌龟和兔子从链表上同一节点开始移动,兔子跑得快,乌龟跑得慢,如果链表中没有环,那么兔子将一直处在乌龟的前方

如果链表中有环,那么兔子会先于乌龟进入环,并一直在环中移动;等到乌龟进入环后,由于兔子的速度快于乌龟,所以兔子一定会在某个时刻追上乌龟

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以根据这个思路来解决这个问题,我们定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步

初始时,慢指针在head位置,快指针在head.next位置

这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表

否则快指针将到达链表尾部,该链表不为环形链表

    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null){
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while(slow!=fast){
            if(fast==null||fast.next==null){
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }

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

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

相关文章

Cyber Triage 3.7 (Windows) - 数字取证和事件响应

Cyber Triage 3.7 (Windows) - 数字取证和事件响应 请访问原文链接&#xff1a;https://sysin.org/blog/cybertriage-3&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 唯一专门用于事件响应的数字取证工具 快速、准确和简单地…

matlab使用教程(4)—数组类型

1多维数组 MATLAB 环境中的多维数组是具有多个下标的数组。创建多维数组的一种方法是调用具有多个参数的 zeros 、 ones 、 rand 或 randn 。例如&#xff0c; R randn(3,4,5); 创建一个 345 数组&#xff0c;共包含 3*4*5 60 个正态分布的随机元素。 三维数组可表示在矩…

数据库端口操作指南

数据库端口主要功能是允许用户通过从这些数据库端口推送或拉取数据&#xff0c;从而将各种数据库集成到用户的数据流中。 打开知行之桥 EDI 系统&#xff0c;在工作流界面右侧可以看到端口选项卡下有众多端口&#xff0c;我们打开数据库分类&#xff0c;可以看到知行之桥 EDI 系…

Linux文件处理命令

目录&#xff1a; linux系统与shell环境准备linux常用命令之文件处理Linux系统登录与文件操作 1.linux系统与shell环境准备 Linux 系统简介&#xff1a; Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而…

电子病历编辑器源码

电子病历系统采取结构化与自由式录入的新模式&#xff0c;自由书写&#xff0c;轻松录入。化实现病人医疗记录&#xff08;包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。&#xff09;的保存、管理、传输和重现&#xff0c;取代手写纸张病历。不仅实现了…

如何使用Spring Boot实现分页和排序?

使用Spring Boot实现分页和排序需要借助Spring Data JPA。Spring Data JPA是Spring Data项目中的一个模块&#xff0c;提供了简化数据访问层的功能&#xff0c;包括分页和排序。 接下来我们通过一段Java代码&#xff0c;展示如何使用Spring Data JPA和Spring Boot实现分页和排…

电压放大器在超声波焊接中的作用以及应用

电压放大器是一种运用于电子设备中的信号放大器&#xff0c;主要作用是将小信号放大为更高幅度的信号。在超声波焊接中&#xff0c;电压放大器起到了重要的作用&#xff0c;它可以将从传感器采集到的微小信号放大为能够被检测和处理的合适大小的信号。 超声波焊接是现代工业生产…

畅游NLP海洋:HuggingFace的快速入门

目录 前言一、HuggingFace介绍1-1、HuggingFace的介绍1-2、安装 二、Tokenizer分词库&#xff1a;分词工具2-0、加载BertTokenizer&#xff1a;需要传入预训练模型的名字2-1、使用Tokenizer对句子编码&#xff1a;2-2、使用增强Tokenizer对句子编码&#xff1a;2-3、批量编码单…

事件传播机制和事件委托

DOM事件流 DOM事件流&#xff08;event flow &#xff09;存在三个阶段&#xff1a;事件捕获阶段、处于目标阶段、事件冒泡阶段。事件捕获&#xff08;event capturing&#xff09;&#xff1a;通俗的理解就是&#xff0c;当鼠标点击或者触发dom事件时&#xff0c;浏览器会从…

数字孪生系统为何开始尝试融合GIS系统?

数字孪生是一种通过数字模型实时仿真现实世界的技术&#xff0c;而GIS&#xff08;地理信息系统&#xff09;则是用于收集、存储、处理和展示地理数据的工具。将数字孪生系统与GIS系统进行融合&#xff0c;可以为各行业带来诸多优势和创新。那么数字孪生系统如何将GIS系统进行融…

Java线程相关

线程优先级 在Java线程中&#xff0c;通过一个整型成员变量priority来控制优先级&#xff0c;优先级的范围从1~10&#xff0c;在线程构建的时候可以通过setPriority(int)方法来修改优先级&#xff0c;默认优先级是5&#xff0c;优先级高的线程分配时间片的数量要多于优先级低的…

[javascript核心-08] V8 内存管理机制及性能优化

V8 内存管理 V8 本身也是程序&#xff0c;它本身也会申请内存&#xff0c;它申请的内存称为常驻内存&#xff0c;而它又将内存分为堆和栈 栈内存 栈内存介绍 栈用于存放JS 中的基本类型和引用类型指针栈空间是连续的&#xff0c;增加删除只需要移动指针&#xff0c;操作速度…

自动收小麦机(牛客2023萌新)

题目链接 示例1 输入 复制 4 1 2 1 1 4 5 2 2 2 3 4 输出 复制 10 说明 在第4格放出水流后&#xff0c;水流会流向第3格&#xff0c;由于第3格高度比第4格低&#xff0c;所以水流继续向左流向第2格&#xff0c;因为平地水流只能流2格&#xff0c;所以到达第2格后水流停…

栈练习题(逆波兰表达式,有效括号,出入栈次序匹配,最小栈)

目录 基础知识: 中缀表达式和后缀表达式(逆波兰式) 中缀表达式转后缀表达式 后缀表达式求结果 有效括号 栈的压入,弹出序列 最小元素栈 基础知识: 栈:是一种先入后出的数据结构,它的底层是由数组实现的 入栈:push(),出栈pop(),查看栈顶元素peek() 中缀表达式和后缀表…

docker-compose搭建prometheus+grafana+钉钉告警

前言&#xff1a; 本文将介绍使用docker-compose部署搭建promtheus监控容器、主机、服务等相关状态&#xff1b; 配合granfana面板构建监控大屏&#xff1b; 由于grafana的报警不是很友好&#xff0c;使用dingtalk&#xff0c;配合altermanager&#xff0c;实现钉钉报警。 …

Crosswalk App UI 自动化

目录 前言&#xff1a; Crosswalk WebDriver 实现 Crosswalk app UI 自动化实现 前言&#xff1a; Crosswalk是一个基于Chromium的开源项目&#xff0c;它提供了一个跨平台的应用程序运行时环境&#xff0c;可以帮助开发人员在移动设备上构建高性能的Web应用程序。在Crossw…

“体验家”亮相第六届IAIC成都国际医美产业大会

6月23日-25日&#xff0c;第六届IAIC成都国际医美产业大会暨“医美之都”高峰会议在成都世纪城国际会议中心成功举行。本次大会邀请了来自国家药品监督管理局、部分省市地区的相关领导莅临指导&#xff0c;以及来自全国100医美行业头部平台&#xff0c;近2000位医美产业领军代表…

关于前后端JSON解析差异问题与思考

目录 一、问题回顾 二、问题思考 2.1 JavaScript如何解析json字符串 2.2 Java如何解析json字符串 2.3 Java和JavaScript交互如何出现JSON解析问题 三、经验总结 本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾 在一次涉及流程表…

FPGA驱动SPI屏幕(附完整工程)

一. 简介 相信大家都玩过屏幕&#xff0c;在FPGA上使用最多的就是VGA/HDMI接口的显示器了&#xff0c;这两种显示器的优点就不用说了&#xff0c;缺点就是体积比较大&#xff0c;而且价格比较贵&#xff0c;对于追求便携/价格低的我来说&#xff0c;SPI接口的屏幕才是我的首要…

实战操作接口自动化测试

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…