当前位置: 首页 > news >正文

链表的面试题8之环形链表

许久不见,那么这是最后倒数第三题了,这道题我们来看一下环形链表。

老规矩贴链接:141. 环形链表 - 力扣(LeetCode)

目录

倒数第k个元素

获取中间元素的问题。

双指针


来,大致看一下题目,这道题目需要我们做什么? 需要我们去判断,这个链表内存不存在环,那我们比较的是什么?比较值肯定是不行,那我们发现,能不能在遍历到一定程度以后,让这个节点的指针域等于我们之前遍历过的节点的指针域。那我们发现我们遍历是存储不了数据的。那么思路就卡死了。

无法高效获取长度,无法根据偏移快速访问元素,是链表的两个劣势。然而面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决。

当然双指针是一种思维,而不是一个公式。这一点需要读者谨记。

直接从双指针开始讲起会显得很云里雾里,所以我们这里铺垫两道题目来穿插这里的思想。对于链表的长度和偏移量的操作需要慎之又慎。

倒数第k个元素

先来看"倒数第k个元素的问题"。设有两个指针 p 和 q,初始时均指向头结点。首先,先让 p 沿着 next 移动 k 次。此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为 k 。然后,同时移动 p 和 q,直到 p 指向空,此时 q 即指向倒数第 k 个结点。可以参考下图来理解:

这里就是固定两人的思想,讲的比较感性一点就像两人推进,前一个人推进结果踩空了之后,那么后一个人就已经知道自己所在位置是对的了。代码放在下面供大家参考。

class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode *p = head, *q = head; //初始化while(k--) {   //将 p指针移动 k 次p = p->next;}while(p != nullptr) {//同时移动,直到 p == nullptrp = p->next;q = q->next;}return q;}
};

获取中间元素的问题。

设有两个指针 fast 和 slow,初始时指向头节点。每次移动时,fast向后走两次,slow向后走一次,直到 fast 无法向后走两次。这使得在每轮移动之后。fast 和 slow 的距离就会增加一。设链表有 n 个元素,那么最多移动 n/2 轮。当 n 为奇数时,slow 恰好指向中间结点,当 n 为 偶数时,slow 恰好指向中间两个结点的靠前一个(可以考虑下如何使其指向后一个结点呢?)

跟上面不一样的是,这里改变的是两个指针的跨度。那么到底怎么让偶数的时候让他指向往后一个节点呢?一种简单的方法是在 fast 无法移动两步时,让 slow 再移动一步。这样,slow 将从中间两个节点的前一个节点移动到后一个节点。 下述代码实现了 n 为偶数时慢指针指向靠后结点。

class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode *p = head, *q = head;while(q != nullptr && q->next != nullptr) {p = p->next;q = q->next->next;}return p;} 
};

双指针

那我们再回来看我们卡在了哪里。

我们在开头的时候为什么卡住了?因为我们想的是单指针的循环遍历问题,考虑遍历后的节点指针域如何储存,或者是再次读取。

那么根据上一个引题我们来总结快慢指针的特性 —— 每轮移动之后两者的距离会加一。  

下面会继续用该特性解决环的问题。
当一个链表有环时,快慢指针都会陷入环中进行无限次移动,然后变成了追及问题。想象一下在操场跑步的场景,只要一直跑下去,快的总会追上慢的。当两个指针都进入环后,每轮移动使得慢指针到快指针的距离增加一,同时快指针到慢指针的距离也减少一,只要一直移动下去,快指针总会追上慢指针。也就是说,套圈了呗!

哈哈,我找了一张很清楚的动图来给大家演示,根据上述表述得出,如果一个链表存在环,那么快慢指针必然会相遇!!!

所以这里再重新提出来两个问题:

1.为什么快指针每次走两步,慢指针走一步可以?

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可
能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动
一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,
快指针肯定是可以追上慢指针的,即相遇。

2.快指针一次走3步,走4步,...n步行吗?

最后贴一下代码

class Solution {
public:bool hasCycle(ListNode *head) {ListNode *slow = head;ListNode *fast = head;while(fast != nullptr) {fast = fast->next;if(fast != nullptr) {fast = fast->next;}if(fast == slow) {return true;}slow = slow->next;}return nullptr;}
};

好了,这道题就讲到这里

如果你觉得对你有帮助,可以点赞关注加收藏,感谢您的阅读,我们下一篇文章再见。

一步步来,总会学会的,首先要懂思路,才能有东西写。

相关文章:

链表的面试题8之环形链表

许久不见,那么这是最后倒数第三题了,这道题我们来看一下环形链表。 老规矩贴链接:141. 环形链表 - 力扣(LeetCode) 目录 倒数第k个元素 获取中间元素的问题。 双指针 来,大致看一下题目,这…...

OBS Studio:windows免费开源的直播与录屏软件

OBS Studio是一款免费、开源且跨平台的直播与录屏软件。其支持 Windows、macOS 和 Linux。OBS适用于,有直播需求的人群或录屏需求的人群。 Stars 数64,323Forks 数8413 主要特点 推流:OBS Studio 支持将视频实时推流至多个平台,如 YouTube、…...

邂逅Node.js

首先先要来学习一下nodejs的基础(和后端开发有联系的) 再然后的学习路线是学习npm,yarn,cnpm,npx,pnpm等包管理工具 然后进行模块化的使用,再去学习webpack和git(版本控制工具&…...

React 常见的陷阱之(如异步访问事件对象)

文章目录 前言1. 异步访问事件对象问题解决方案 2. 事件传播的误解**问题**解决方案 **3. 事件监听器未正确卸载****问题****解决方案** **4. 动态列表中的事件绑定****问题****解决方案** **5. 第三方库与 React 事件冲突****问题****解决方案** **6. 表单输入与受控组件****问…...

【LinkedList demo 内部类讲说】

LinkedList demo 内部类讲说 1. Node节点2.MyLinkedList3. LinkedListTest 测试类 1. Node节点 public class Node<T> {private Node<T> pre;private Node<T> next;private T data;public Node() {}public Node getPre() {return pre;}public void setPre(N…...

Sql刷题日志(day9)

一、笔试 1、limit offset&#xff1a;分页查询 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳过前 start_row 行&#xff0c;返回接下来的 number_of_rows 行。 2、lag、lead&#xff1a;查询前后行数据 --lag函数用于访问当…...

46 python pandas

Pandas是Python数据分析的利器,也是各种数据建模的标准工具 一、什么是pandas pandas 是 Python 中用于数据处理和分析的核心库,提供了高效的数据结构(如Series和DataFrame)和数据操作工具,广泛应用于数据清洗、分析、可视化等场景。 最常用的是用来处理excel数据。 二…...

告别延迟!Ethernetip转modbustcp网关在熔炼车间监控的极速时代

熔炼车间热火朝天&#xff0c;巨大的热风炉发出隆隆的轰鸣声&#xff0c;我作为一名技术操控工&#xff0c;正密切关注着监控系统上跳动的各项参数。这套基于EtherNET/ip的监控系统&#xff0c;是我们车间数字化改造的核心&#xff0c;它将原本分散的控制单元整合在一起&#x…...

Prompt Tuning:高效微调大模型的新利器

Prompt Tuning(提示调优)是什么 Prompt Tuning(提示调优) 是大模型参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)的重要技术之一,其核心思想是通过优化 连续的提示向量(而非整个模型参数)来适配特定任务。以下是关于 Prompt Tuning 的详细解析: 一、核心概念…...

⼆叉搜索树详解

1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结…...

CompleteableFuture的异步任务编排

为什么会有CompleteableFuture Java 的 1.5 版本引入了 Future&#xff0c;可以把它简单的理解为运算结果的占位符&#xff0c; 它提供了两个方法来获取运算结果。 get()&#xff1a;调用该方法线程将会无限期等待运算结果。get(longmeout, TimeUnit unit)&#xff1a;调用该…...

珈和科技贺李德仁院士荣膺国际数字地球学会会士:以时空智能赋能可持续发展目标 绘就数字地球未来蓝图

4月22日&#xff0c;第十四届国际数字地球会议在重庆盛大启幕。在这场在全球范围内数字地球领域具有国际影响力的学术盛会上&#xff0c;国际数字地球学会向珈和科技的企业顾问&#xff0c;2023年度国家最高科学技术奖得主李德仁院士授予了“国际数字地球学会会士”最高荣誉称号…...

【CodeBuddy 】从0到1,打造一个“牛马打鸡血仪”

【CodeBuddy 】从0到1&#xff0c;打造一个“牛马打鸡血仪” 我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 &#x1f31f;嗨&#xff0c;我是LucianaiB&#…...

BI是什么意思?一文讲清BI的概念与应用!

目录 一、BI 是什么意思 1. BI 的定义 2. BI 的发展历程 3. BI 的核心组件 二、BI 的应用场景 1. 销售与市场营销 2. 财务管理 ​编辑3. 人力资源管理 4. 生产与运营管理 ​编辑三、选择合适的 BI 工具 1. 考虑企业的需求和规模 2. 评估工具的功能和性能 3. 关注工…...

可编辑PPT | 华为安全架构设计方法指南华为数字化转型架构解决方案

这份文档是华为的安全架构设计方法指南&#xff0c;它详细介绍了安全架构设计的重要性、方法和流程。文档强调安全架构是软件研发技术体系中的关键DFX能力&#xff0c;与可靠性、性能等并列&#xff0c;尤其在云计算和复杂网络环境下&#xff0c;安全性设计显得尤为重要。华为的…...

1.6 提示词工程(二)

目录 3.2 提供参考文本 3.2.1 使用参考文本来构建答案​ 3.2.2 指导模型用引用的文本回答问题​ 3.3 把复杂的任务拆分成简单的子任务​ 3.3.1 利用意图分类确定与用户查询最相关的指令​ 3.3.2 针对需要长时间对话的应用程序&#xff0c;应概括或过滤之前的对话内容​ …...

WIFI信号状态信息 CSI 深度学习之数据集

Building occupant activity sensing dataset based on WIFI CSI&#xff08;WiSA&#xff09; 所有的数据以及实验参数都上传到了figshare中并配备详细说明&#xff0c;供参考。 论文链接&#xff1a;WiSA: Privacy-enhanced WiFi-based activity intensity recognition in …...

基于服务器的 DPI 深度分析解决方案

一、传统网络流量分析的瓶颈与挑战 在企业网络管理体系中&#xff0c;传统流量分析模式高度依赖网络设备作为数据采集核心节点&#xff0c;无论是基于 NetFlow/IPFIX 等流协议的流量分析&#xff0c;还是通过端口镜像技术实现的流量监控&#xff0c;均以交换机、路由器等网络设…...

动态规划(5):线性动态规划

引言 所谓线性动态规划,通常指状态定义和转移具有线性结构的动态规划问题,其状态通常可以用一维数组表示,状态转移主要依赖于相邻或前面有限个状态。这类问题的特点是状态空间呈线性排列,每个状态只与有限个前置状态相关,使得问题结构相对简单,更容易理解和掌握。 一维…...

c语言- 如何构建CMake项目(Linux/VSCode)

目录 linux&#xff08;vscode&#xff09;构建C语言CMake项目 1. 检查linux是否下载cmake&#xff0c;否则执行下列代码 2. 在vscode下载cmake的插件CMake Tools 3. 构建项目&#xff08;项目结构&#xff09; 4. 进行cmake配置 1. 在VS Code中按下ctrl shift p键&…...

HJ17 坐标移动【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ17 坐标移动 一、题目描述 二、测试用例 三、解题思路 基本思路&#xff1a;   这题的难点在于理解题目和如何处理各种情况。题目是给定一串指令&#xff0c;首先要判断指令是否合法…...

HGHAC集群滚动扩展或更换硬盘设备

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;N/A 版本&#xff1a;4.5.8 文档用途 集群版本&#xff1a;hghac4.2.1 数据库版本&#xff1a;hgdb-see-4.5.8 此步骤适用于所有hac架构的hgdb集群。 主要用途&#xff1a;HAC集群服务器滚动扩展或更换硬盘 本文…...

虚拟环境中VSCode运行jupyter文件

用VS Code打开jupyter文件&#xff0c;点击右上角 Select Kernel 在正上方会出现这个选择框&#xff0c;选择 Python Environment 会出来所有的虚拟环境&#xff0c;选择要用的环境行...

【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板

1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛&#xff0c;打算出一个系列的博客&#xff0c;记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点&#xff0c;如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类&#xff1a; 1.1. 单独模块的讲…...

力扣-盛最多水的容器

1.题目描述 2.题目链接 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 3.题目解析 题目中的储水量两边差*短边高度。也就是说&#xff0c;两条边中&#xff0c;决定储水量的是短边的高度。 我们可以定义两个指针&#xff0c;一个在最左边&#xff0c;一个在…...

数据实时同步:inotify + rsync 实现数据实时同步

1 数据实时同步 在生产环境中&#xff0c;某些场景下&#xff0c;要将数据或文件进行实时同步&#xff0c;保证数据更新后其它节点能立即获得最新的数据。 数据同步的两种方式 PULL&#xff1a;拉&#xff0c;使用定时任务的方式配合同步命令或脚本等&#xff0c;从指定服务…...

C#学习第24天:程序集和部署

程序集知识点 1.程序集的基本概念 程序集是部署和版本控制的最小单位。它可以是可执行文件&#xff08;.exe&#xff09;或动态链接库&#xff08;.dll&#xff09;。包含元数据和清单&#xff08;Manifest&#xff09;&#xff0c;描述程序集的内容和依赖关系。 2.程序集清单…...

mac .zshrc:1: command not found: 0 解决方案

nano ~/.zshrc 使用自带的nano命令打开文件&#xff0c;修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下&#xff0c;不是常用这个命令&#xff0c;除非是遇到有问题的文件&#xff0c;才用&#xff0c; 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…...

学习设计模式《十》——代理模式

一、基础概念 代理模式的本质【控制对象访问】&#xff1b; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff1b; 代理模式的功能&#xff1a;代理模式是通过创建一个代理对象&#xff0c;用这个代理对象去代表真实的对象&#xff1b;客户端得…...

RestFul操作ElasticSearch:索引与文档全攻略

RestFul方式操作ES 索引库操作 创建索引库 PUT /索引库名称 {"mappings":{"properties":{"字段名":{"type":"字段类型","analyzer":"分词器","index":"是否参与搜索(布尔值)"},…...

OpenCV 图像读取与显示

一、知识点: 1、读取图像 (1)、Mat imread( const String & filename, int flags IMREAD_COLOR_BGR ); (2)、返回值: Mat&#xff0c;返回读取的图像。 若读取图像失败&#xff0c;则返回一个空的对象&#xff0c;对象.empty()为true。 (3)、参数filename: String是…...

Django快速入门篇

Django官网 https://docs.djangoproject.com/zh-hans/4.2/ 官方介绍 官方版本 推荐LTS版本&#xff0c;python3.9/3.10 djongo 每两年会出一个LTS版本 关于环节djongo&#xff0c;conda直接安装即可 conda create -n myenv python3.9 conda activate myenv pip install dj…...

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…...

当PLC遇上电焊机器人:EtherCAT转CANopen上演工业级“语言翻译官”

在汽车自动化产线中&#xff0c;PLC与电焊机器人的高效协同是提升生产效率的关键。但PLC常用的EtherCAT协议与电焊机器人采用的CANopen协议存在通信壁垒&#xff0c;JH-ECT009疆鸿智能EtherCAT转CANopen技术成为打破这一障碍的核心方案。 应用拓扑图 EtherCAT是高速工业以太网协…...

LeetCode 1345. 跳跃游戏 IV(困难)

题目描述 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。 每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a; i 1 需满足&#xff1a;i 1 < arr.lengthi - 1 需满足&#xff1a;i - 1 …...

Linux bash shell的循环命令for、while和until

1、for命令 for命令&#xff0c;允许你创建一个遍历一系列值的循环&#xff0c;每次迭代都使用其中一个 值来执行已定义好的一组命令。 for var in list do commands done # 在list参数中&#xff0c;你需要提供迭代中要用到的一系列值。 # 可以通过几种不同的方法指定列表中的…...

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】&#xff1a;用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据&#xff1f;准备工作&#xff1a;创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...

Mac如何允许安装任何来源软件?

打开系统偏好设置-安全性与隐私&#xff0c;点击右下角的解锁按钮&#xff0c;选择允许从任何来源。 如果没有这一选项&#xff0c;请到打开终端&#xff0c;输入命令行&#xff1a;sudo spctl --master-disable, 输入命令后回车&#xff0c;输入电脑的开机密码后回车。 返回“…...

云原生主要架构模式

云原生(Cloud Native)是一种利用云计算的优势来构建和运行可扩展、弹性和高效应用程序的方法。它不仅仅是技术的集合,更是一种架构和设计理念。本文将围绕你提出的几部分,深入探讨云原生主要的架构模式,帮助你理解如何利用这些模式构建现代化的应用。 1. 服务化架构模式(…...

Neon数据库:让Postgres更智能的选择!

Neon&#xff1a;革新的Serverless PostgreSQL解决方案 在当今快速发展的技术世界&#xff0c;数据库的效率和灵活性成为众多开发者关注的重中之重。Neon&#xff0c;以其独特的serverless架构&#xff0c;正引领着这一变革。本文将深入探讨Neon的独特构架、应用场景以及具体的…...

《Metasploit框架核心模块解析与安全防护实践》​

目录 ​​一、框架模块化设计与安全验证价值​​ ​​1. 漏洞验证模块&#xff08;Exploit Modules&#xff09;​​ ​​2. 安全评估模块&#xff08;Auxiliary Modules&#xff09;​​ ​​3. 安全响应模块&#xff08;Post-Exploitation&#xff09;​​ ​​4. 载荷安全…...

C#:多线程Task使用

一.Task与Thread Task是架构在Thread之上的&#xff0c;也就是说任务最终还是要抛给线程去执行。Task跟Thread不是一对一的关系&#xff0c;比如开10个任务并不是说会开10个线程&#xff0c;这一点任务有点类似线程池&#xff0c;但是任务相比线程池有很小的开销和精确的控制。…...

Nginx笔记

一、概述 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个电子邮件代理服务器。正向代理服务的是客户端&#xff08;比如VPN&#xff09;&#xff0c;反向代理服务的是服务端。Nginx是多进程的&#xff0c;有一个Master进程控制多个Worke…...

小米便签源码部署流程

一、准备环境 1. 安装必要工具 Android Studio&#xff1a;最新稳定版&#xff08;需支持 Kotlin 和 Jetpack Compose&#xff09;。 JDK&#xff1a;建议 JDK 11 或更高&#xff08;通过 sdkman 或 brew 安装&#xff09;。 Git&#xff1a;用于克隆源码。 2. 配置国内镜像源&…...

DAY 30 超大力王爱学Python

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 步骤 1&#xff1a;创建项目结构 …...

左右边界策略

这是一套完整的交易逻辑策略,涵盖了从函数定义、指标计算、信号生成到资金和仓位管理、加仓和减仓逻辑、以及止损和止盈逻辑的各个方面。 以下对该交易系统进行详细分析: 交易逻辑思路 1. 函数定义 - DZSell 和 DZBuy 函数:这两个函数用于计算卖出和买入的价格区间。它…...

iOS苹果和Android安卓测试APP应用程序的区别差异

在当今这个移动互联网时代&#xff0c;iOS和Android作为两大主流操作系统&#xff0c;它们在测试应用程序时存在哪些差异呢&#xff1f;这不仅是一个技术问题&#xff0c;也是一个市场策略问题。让我们从一个实际案例开始探讨。 假设我们有一个新的社交应用需要在iOS和Android…...

【Python装饰器深潜】从语法糖到元编程的艺术

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...

Kubernetes中微服务JVM监控与自动发现的解决方案

以下是针对 Kubernetes 中微服务 JVM 监控与自动发现的解决方案,结合 Prometheus 的动态发现机制和 Spring Boot 的监控能力,解决 Pod IP 动态变化和当前微服务监控数据暴露匿名随意访问的安全问题。 一、微服务端配置(Spring Boot 微服务) 1. 依赖配置(pom.xml) <…...

mapbox进阶,纯前端geojson转shape,并将shape相关文件压缩成zip压缩包并下载

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀纯前端geojson转…...