判断链表是否有环

2023-05-16

题目:

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

哈希表法

思路: 遍历单链表中的某个节点,将遍历到的每个节点在hashSet中是否存在,若不存在,就将该节点加入到hashSet中,若在hashSet中找见正在遍历的节点,就说明该单链表有环。

/**
 * 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;
            } else {
                set.add(head);
            }
            head = head.next;
        }
        return false;
    }
}

时间复杂度O(N),空间复杂度O(N)

快慢指针

思路: 从头节点开始,快指针一次走两步,慢指针一次走一步,若链表有环,则快慢指针一定会相遇。若快慢指针不相遇,说明没环。


/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * 快慢指针
     * @param head
     * @return
     */
    public boolean hasCycle(ListNode head) {

        if (head == null || head.next == null || head.next.next == null) {
            return false;
        }
        ListNode low = head.next;
        ListNode fast = head.next.next;
        while(low != fast) {
            // 由于快指针走的块,所以判断快指针的next和快指针的next.next 是否为空即可,防止出现空指针
            if (fast.next == null || fast.next.next == null) {
                return false;
            }
            low = low.next;
            fast = fast.next.next;
        }

        return true;
    }
}

时间复杂度O(N), 空间复杂度O(1)

思考: 若需要返回入环的第一个节点,该怎么做。

哈希表法

思路: 遍历单链表中的某个节点,将遍历到的每个节点在hashSet中是否存在,若不存在,就将该节点加入到hashSet中,否则,第一次在hashSet中找见的节点即为第一个入环的节点。


/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
	/**
     *  使用额外空间的方法,使用hashMap
     * @param head
     * @return  返回成环的节点
     */
    public ListNode hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        while(head != null) {
            if (set.contains(head)) {
                return head;
            } else {
                set.add(head);
            }
            head = head.next;
        }
        return null;
    }
}

时间复杂度O(N),空间复杂度O(N)

快慢指针

思路: 从头节点开始,快指针一次走两步,慢指针一次走一步,若链表有环,则快慢指针一定会在环上的某个节点相遇,之后,快指针回到开头变成一次走一步,慢指针在原地开始继续一次走一步,再次相遇的节点一定在入环的第一个节点处。



/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * 快慢指针
     * @param head
     * @return
     */
    public ListNode hasCycle(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return null;
        }
        ListNode low = head.next;
        ListNode fast = head.next.next;
        while(low != fast) {
            // 由于快指针走的块,所以判断快指针的next和快指针的next.next 是否为空即可,防止出现空指针
            if (fast.next == null || fast.next.next == null) {
                return null;
            }
            low = low.next;
            fast = fast.next.next;
        }
        fast = head;
        while (low != fast) {
            low = low.next;
            fast = fast.next;
        }
        return low;
    }
}

时间复杂度O(N), 空间复杂度O(1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断链表是否有环 的相关文章

  • Maven setting.xml国内镜像仓库(全)

    打开setting xml 位置在apache maven 3 6 1 conf下面 Ctrl 43 F 查找mirror标签位置加入即可 lt maven官方镜像 gt lt mirror gt lt id gt mirrorId lt
  • Android Studio创建项目

    一 创建新项目 二 选择空白页项目类型 三 设置项目信息 四 下载SDK 只有初次创建时会下载 下载完成 五 初始化项目工程 初始化完成
  • 解决MATLAB"尝试将 SCRIPT open 作为函数执行"的问题

    解决MATLAB 34 尝试将 SCRIPT open 作为函数执行 34 的问题 当关闭MATLAB一个脚本的时候 xff0c 再次双击打开 xff0c 会出现下图的情况 xff1a 脚本无法打开 xff0c 只能用实时脚本的方式打开 x
  • SMM(Spring+SpringMVC+MyBatis)

    Spring amp SpringMVC amp MyBatis 一 Spring的体系结构 自下往上 xff1a TestCore Container 核心容器 Beans xff1a 容器Core xff1a 核心Context xff
  • 二、SpringBoot基础配置

    二 SpringBoot基础配置 二 SpringBoot基础配置1 复制工程2 属性配置3 配置文件分类3 1 配置文件优先级3 2 教你一招 xff1a 自动提示功能消失解决方案 4 yaml文件5 yaml数据读取5 1 读取单一数据
  • FSK和ASK区别

    简介 市面上的遥控器常见的有FSK和ASK两种 xff0c 一种是有应答 xff0c 一种无应答 xff0c 现将主要区别罗列如下 FSK和ASK区别 FSK xff1a 频率调制 ASK xff1a 振幅调制 ASK IC一般只发射不接受
  • 关闭集群机器命令脚本

    背景 没有脚本时 xff0c 关闭集群里的Linux机器 xff0c 需要分别在每台机器执行关机命令 xff0c 费时费力 hadoop 64 node2 sudo init 0 hadoop 64 node3 sudo init 0 ha
  • ubuntu系统如何建立可执行文件

    第一步 xff1a 在桌面建立一个新建文档 gt 空文件 xff0c 文档重命名为test txt 第二步 xff1a 打开test txt xff0c 在文档的最顶端写入 bin bash xff08 独占一行 xff09 如 xff1a
  • 自己动手写操作系统(高清图书+源代码)分享

    很喜欢 自己动手写操作系统 这本书 xff0c 但现在这本书已经绝版了 在这里分享一下这本书的高清电子版和源代码 xff0c 感兴趣的人可以下载一下 链接 xff1a https pan baidu com s 1lPXg Airu2NFj
  • Android Studio闪屏页

    现在很多 App 启动都有闪屏页和功能引导页 xff0c 那么接下来我们就来先看看闪屏页是怎么实现的吧 首先创建一个新的工程 xff0c 然后创建一个新的Empty Activity xff0c 在这我就命名为SplashActivity
  • layui图标显示方框

    解决方法 检查一下class里面是不是少了一个图标的默认class layui icon
  • win10下python代码打包成exe文件并作为服务后在后台运行,开机自启

    1 pip安装pyinstaller pip install pyinstaller 2 打包python文件 打开cmd xff0c cd到项目文件夹 xff0c 并将主文件 xff08 我这里是web py xff09 用pyinsta
  • ubuntu为软件设定图标

    第一步 xff1a 进入到usr share applications 文件夹下 cd usr share applications 第二步 xff1a 创建桌面图标 xff1a sudo touch clion desktop 第三步 x
  • ubuntu18.04.1 开机默认进入命令行模式/用户图形界面

    一 开机默认进入命令行模式 1 输入命令 xff1a sudo systemctl set default multi user target 2 重启 xff1a reboot 要进入图形界面 xff0c 只需要输入命令startx 从图
  • ftp上传图片损坏怎么办?

    ftp不适用于普通的传输文件 xff0c 必须使用二进制的传输格式才可以保证图片上传不被损坏 添加这两行代码即可 xff01
  • python基础-古诗词填词游戏

    很久没写爬虫了 xff0c 利用这次接单来顺便写一下爬虫 文章目录 1 项目需求2 思路梳理3 诗句处理遇到的问题有4 目录结构5 实现步骤6 收获7 不足 1 项目需求 用python实现古诗词填词游戏 诗词库的组成 初中古诗 备注 xf
  • 谈谈如何确保数据的一致性

    谈谈如何确保数据的一致性 数据库必须具备的四个特性背景什么是接口的幂等性 xff1f 幂等性在哪里会用到 xff1f 技术方案总结 参考https blog csdn net u011635492 article details 81058
  • vmware esxi 虚拟机管理常用命令

    1 查看所有虚拟机列表 vim cmd vmsvc getallvms 2 挂起虚拟机 vim cmd vmsvc power suspend 13 命令行中的数字都是为vmid xff0c 以下同理 xff01 3 恢复或打开虚拟机 vi
  • python+tensorflow CNN卷积神经网络手写字体识别

    导入所需的库模块 xff1a span class token keyword import span os span class token keyword import span cv2 span class token keyword
  • 报错记录:Error in grid.Call(C_stringMetric, as.graphicsAnnot(x$label))

    今天在跑monocle2 xff0c 出图时报了个错 Fibroref5k lt setOrderingFilter Fibroref5k disp genes p1 lt plot ordering genes Fibroref5k p1

随机推荐

  • KMP算法——字符串匹配问题

    贴上原址 xff1a http www ruanyifeng com blog 2013 05 Knuth E2 80 93Morris E2 80 93Pratt algorithm html 感觉这篇文章讲得很不错 xff0c 很容易懂
  • 教你怎么在Pycharm上安装Manim(Pycharm+Manim)

    首个教你怎么在Pycharm下安装Manim的教程 1 安装环境 PycharmGitManim 前两个都是程序员标配了 只需要去github download zip或者本地git clone一下Manim就可以 2 创建工程 把下载完成
  • java 后台list转换成json向前台传值

    通常前台js需要对后台传过来的值进行解析 xff0c 如果后台向前台传入的是一个json串的话 xff0c js比较容易处理 后台 根据自己需求写一个list List lt Object gt list 61 assistAdpater
  • windows美化指南秒变mac风格

    windows美化指南秒变mac风格 现如今网络的发展 xff0c 几乎每个人都有了一台电脑 xff0c 随着时代的进步 xff0c 由原来的winxp到win7到win10再到现在的win11 xff0c 每个系统无论是从底层架构还是外观
  • shell中使用ssh批量重启关闭/etc/hosts中添加了的机器

    ssh批量关闭 etc hosts中添加了的机器 xff0c 可自行修改 span class token shebang important bin bash span span class token keyword while spa
  • Windows Terminal的oh-my-posh配置方案

    参考Tutorial Set up a custom prompt for PowerShell or WSL with Oh My Posh 1 安装字体 NerdFonts字体下载 本人选择DejaVuSanMono Nerd Font
  • PX4系统学习

    PX4系统学习 扑翼飞行器的硬件组成飞控板电调电调的分类 舵机 扑翼飞行器的硬件组成 要了解学会二次开发首先要知道 xff0c 手头的飞行器的硬件结构 以及各个部分的结构是有何种作用的 xff0c 这样才能在根本上了解编程逻辑 xff0c
  • Java歌手评分系统

    有五个评委 xff0c 对一个歌手唱歌打分 xff0c 最终得分要求去掉最高分去掉最低分 xff0c 求平均分 注意要求的格式为 xff1a 输入第1个评委给分 97 1 输入第2个评委给分 89 2 输入第3个评委给分 88 6 输入第4
  • Linux 生产者消费者问题代码实现

    进程间通信 Linux xff1a 使用多线程和信号量解决生产者 消费者问题 xff1a 有一个长度为N的缓冲池被生产者和消费者共同使用 只要缓冲池未满 xff0c 生产者就可以将消息送入缓冲池中 xff1b 只要缓冲池不空 xff0c 消
  • Nocas单机启动命令

    之前在Linux中单机启动Nocas使用命令 xff1a sh startup sh m standalone 但是在cmd窗口使用该命令不行 xff0c 因为sh命令是在Linux系统中的文件 xff1b 而在本机cmd窗口运行Nocas
  • 项目中的resources目录中新建yml或properties文件,但是启动项目,没有读取到配置文件中的配置

    我的文件的图标显示这样 xff0c 说明SpringBoot加载时没有加载这个文件 1 查看yml properties文件中的内容是否有错 2 重启idea重启项目 3 手动设置该文件夹和文件为Spring的配置文件 右击resource
  • 二维数组的子数组之和的最大值

    对于一维的数组 xff0c 要求其子数组之和的最大值很简单 xff0c 动态规划轻松解决 xff0c 复杂度O N span style background color rgb 255 255 255 font family none f
  • MySQL错误ERROR 1046 (3D000): No database selected解决办法

    No database selected可以理解为没有选择种数据库 先在查看数据库种包括的database有哪些 xff0c 选择自己要操作的数据 记住database后面一定加s 选择自己要操作那一个数据库 这样选择之后mysql gt
  • CentOS7使用su命令切换到root用户:su:鉴定故障

    安装完CentOS7后 xff0c 在设置过程中设置了root密码 xff0c 但是当从普通用户切换到root用户时报错 这时就想到可以将系统模式切换到单用户模式下 xff0c 修改root密码 重启CentOS7系统 xff0c 按e键
  • CentOS7版本设置系统的静态IP地址

    每次CentOS7重新开机 xff0c 系统的IP地址都会改变 xff0c 使用起来很不方便 xff0c 所以就将系统的IP设置为静态不变的IP 首先需要找到CentOS7版本的网络配置文件在哪里 xff0c 版本不一样可能配置文件不一样
  • “Job for docker.service failed because the control process exited with error code.” 问题解决

    前一天使用Docker还可以 xff0c 第二天使用systemctl start docker命令启动 xff0c 结果 我找问题花了两个小时 xff0c 在哪里一通乱找 xff0c 一通乱查 xff0c 网上乱看博客 xff0c 浪费了
  • RocketMQ同一Topic、消费组创建多个消费者失败问题

    文章目录 业务场景问题复现解决方式问题跟踪 业务场景 rocketmq建议一个服务对应一个topic xff0c 但是一个服务下会有多个不同的业务消息 xff0c 同时rocketmq建议不同的业务消息对应不同的tag xff0c 当Spr
  • AD18设计PCB时常见问题及操作

    我做PCB设计时 xff0c 常采用AD18这个软件 xff0c 使用过程中经常碰到一些问题 xff0c 遇到查了半天解决了 后来又碰到了 xff0c 索性记一下吧 xff0c 以后碰到的也陆陆续续记上来 xff0c 图片不一定用自己的了
  • C/C++中的new和delete的实现过程

    文章目录 newdeletenew delete 下面是 C 43 43 Primer 5th 中P726 对 new 和 delete 过程的解释 xff1a 当我们使用一条new表达式时 xff0c 实际上执行了三步操作 xff1a n
  • 判断链表是否有环

    题目 xff1a 给你一个链表的头节点 head xff0c 判断链表中是否有环 如果链表中有某个节点 xff0c 可以通过连续跟踪 next 指针再次到达 xff0c 则链表中存在环 为了表示给定链表中的环 xff0c 评测系统内部使用整