链表操作III

        看这篇文章之前,可以先看看链表操作I和链表操作II。而这篇文章主要是想说明两道关于链表环的问题。

环形链表

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

在这里插入图片描述
注:图片转载自leetcode官网。

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

        这题的基本思路是使用快慢指针,快指针每次走两步,慢指针每次走一步,如果链表无环,fast最终会指向null,如果链表有环,则慢指针最终会与快指针相遇。以上图的为示例,说明上述代码的执行过程。slow走一步到2,fast走两步到0,没有相遇。fast走两步到2,slow走一步到0,没有相遇。fast走两步到-4,slow走两步到-4,二者相遇,返回true。

环形链表II

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

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        if(head == null) return null;
        while(fast.next != null && fast.next.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(fast == slow){
                slow = head;
                while(slow != fast){
                    slow = slow.next;
                    fast = fast.next;
                }
                return slow;
            }
        }
        return null;
    }
}

        与上一题相比,这题还需要找到入环的位置。这题的基本思路也是使用快慢指针,快指针每次走两步,慢指针每次走一步,当两个指针相遇时,重新让慢指针从链表头开始走,快指针从相遇点开始走,当两个指针再次相遇的位置即为入环位置。leetcode上给出了详细的解释,这里按个人理解说明一下。
在这里插入图片描述
注:图片转载自leetcode官网。
        设链表表头到入环点共有a个结点,指针进入环后按图中顺时针箭头行走,慢指针进入环后走过b个结点后相遇。此时快指针走过的路径为a + n(b + c) + b。b + c为整个环,n表示快指针走过整个环的圈数。同时还需要满足一个要求就是快指针走过的路径是满指针路径的两倍,因为快指针每次走两步,慢指针每次走一步。慢指针走过的路径(结点数)为a + b。快指针走过的路径就为2 * (a + b),那就是说a + n(b + c) + b = 2 * (a + b)。整理一下得到a = c + (n - 1)(b + c)。也就是说链表头到入环点的路径长等于(n - 1)圈的整个环长度加上相遇点到入环点的距离。换句话说,如果一个指针从链表头出发,一个指针从相遇点出发,那么从链表头开始走的指针走到入环点时,一定会与从入环点开始走的指针相遇,而此时从相遇点开始走的指针走过的路径长度为(n - 1)圈的环长加上相遇点到入环点的距离。这就是为什么快慢指针相遇后,将慢指针(不一定要慢指针,快指针或者重新定义一个指针都可以)从链表头开始走,而快指针从相遇点开始走,当二者再次相遇时,再次相遇点就是入环点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【六十】【算法分析与设计】用一道题目解决dfs深度优先遍历,dfs中节点信息,dfs递归函数模板进入前维护出去前回溯,唯一解的剪枝飞升返回值true

路径之谜 题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着音走,也不能跳跃。每走到一个新方格,就要向正北 方和正西…

【Linux】解决ubuntu20.04版本插入无线网卡没有wifi显示【无线网卡Realtek 8811cu】

ubuntu为Realtek 8811cu安装驱动,解决wifi连接问题 1、确认无线网卡的型号-Realtek 8810cu2、下载并配置驱动 一句话总结:先确定网卡的型号,然后根据网卡的型号区寻找对应的驱动下载,下载完成之后在ubuntu系统中进行编译&#xff…

3D 文件格式的江湖纷争

自从上世纪 60 年代计算机辅助设计(Computer Aided Design, CAD)发明已来,3D 图形产业繁荣发展,逐步覆盖工业制造、影视游戏、VR/AR 、3D 打印等各个领域。如果说 3D 模型是构成 XR 应用场景的基础组件,那么 3D 文件格式就是构建 XR 世界沟通语言。而伴随各种 3D 建模软件…

C++链表操作入门

数据结构基础:链表操作入门 数据结构基础:链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础:链表操作入门 在计算机科学中,数据结构是组织和存储数据的方式&#x…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准,也被称作MPEG-4 AVC(Advanced Video Coding),是一种被广泛使用的数字视频压缩标准,由国际电信联盟(ITU-T)和国际标准化组织(ISO)共同开发。…

【蓝牙协议栈】【BLE】低功耗蓝牙工作流程(角色\广播\扫描\连接等专业名词介绍)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#x…

谷歌搜索seo排名怎么做上去?

谷歌算法纵使千变万化,用户体验(UX)也始终是核心,用户体验包含很多,但核心就是让访问你网站的人觉得你的网站看着顺眼,同时轻松找到他们需要的信息或服务,这意味着你的网站得易于导航&#xff0…

命名空间:namespace

对于无名命名空间 :但是不能再次定义相同名称的变量 在同一文件中

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘,涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

微信小程序实时日志使用,setFilterMsg用法

实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题,我们推出了实时日志功能。开发者可通过提供的接口打印日志,日志汇聚并实时上报到小程序后台。开发者可从We分析“性能质量->实时日志->小程序日志”进入小程序端日志查询页面&am…

【八股】计算机网络篇

网络模型 应用层【HTTP👉报文/消息】 传输层【TCP或UDP👉段👉MSS】网络层【IP、寻址和路由👉MTU】 ①IP(Internet Protocol,网际协议)主要作用是定义数据包的格式、对数据包进行路由和寻址&…

【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解

前言 大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

2024免费最好用的苹果电脑mac虚拟机工具Parallels Desktop19中文版下载

一、软件概述 Parallels Desktop是一款专为Mac设计的虚拟机软件,它允许用户在Mac上同时运行Windows、Linux等多个操作系统,而无需额外的硬件设备。通过Parallels Desktop,Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序。…

Burpsuite CA证书导入浏览器、导入本地

前言 为什么要导入证书,因为要获得浏览器的信任、本地的信任;才能抓包 导入浏览器 1.从bp导出证书 然后打开火狐浏览器 打开bp,设置好代理 火狐浏览器foxyproxy开启代理 访问https://www.baidu.com 可以抓到https的包 本地导入CA证书 可能某一天你要…

AIGC实战——基于Transformer实现音乐生成

AIGC实战——基于Transformer实现音乐生成 0. 前言1. 音乐生成的挑战2. MuseNet3. 音乐数据3.1 巴赫大提琴组曲数据集3.2 解析 MIDI 文件3.3 分词3.4 创建训练数据集 4. MuseNet 模型4.1 正弦位置编码4.2 多输入/输出 5. 音乐生成 Transformer 的分析6. 多声部音乐分词6.1 网格…

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接: https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况: 1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…

JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)

目录 Arrays Arrays类提供的的常见方法 用法示例 Comparable、Comparator Comparable Comparator 本篇学习Arrays,不算作是重点知识,但是为学习后面的Lambda表达式打一个基础,或者说,作为铺垫。 Arrays 用来操作数组的一个…

初见-响应式编程-002

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace #Reacti…
最新文章