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

【算法刷题】链表

文章目录

  • 环形链表
    • 判断是否有环
    • 找出环的入口位置
  • 双指针
    • 反转链表(Reverse a Linked List)
    • 移除链表中的指定元素(Remove Linked List Elements)


环形链表

判断是否有环

环形链表是指链表中的某些节点的 next 指针指向了链表中的某个前面的节点,导致链表中的节点构成一个环。

思路:快慢指针(Floyd 判圈算法)

我们可以使用 快慢指针 来判断链表中是否有环。这种方法也叫做 Floyd 判圈算法,是一个经典且高效的解法。

​ • 快指针(slow pointer) 每次移动一步。

​ • 慢指针(fast pointer) 每次移动两步。

判断条件:

  1. 如果链表中没有环,快指针最终会遇到 null,这时候说明链表没有环。
  2. 如果链表有环,快指针和慢指针一定会相遇,因为快指针每次移动两步,而慢指针每次移动一步,快指针追得上慢指针。
    // 判断 是否有环public boolean hasCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {return true;}}return false;}

找出环的入口位置

一旦我们知道链表有环,下一步就是 找到环的入口。这可以通过以下的步骤来实现:

思路:

​ 1. 判断环的存在:首先使用快慢指针来判断链表是否有环,如果没有环,则直接返回 null。

​ 2. 找到环的入口

​ • 假设链表有环,快慢指针在环内相遇。

​ • 将其中一个指针从头节点开始,另一个指针保持在相遇位置。

​ • 然后,两个指针同时每次移动一步。它们相遇的位置就是环的入口。

为什么能这么做?

​ • 假设链表总共有 n 个节点,其中前 k 个节点在环外,后 n-k 个节点在环内。

​ • 当快慢指针在环内相遇时,假设慢指针在环内相遇的位置是 X。

​ • 如果将其中一个指针移回链表的起点,并让两个指针同时移动,每次移动一步,它们必定会在环的入口相遇。

public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;// 1. 判断有没有环while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) { // 快慢指针相遇,说明有环break;}}// 如果没有环,直接返回 nullif (fast == null || fast.next == null) {return null;}// 2. 找到环的入口fast = head; // 快指针移到链表头while (slow != fast) {slow = slow.next;fast = fast.next;}return slow; // 返回环的入口
}

双指针

反转链表(Reverse a Linked List)

反转链表是链表操作中最经典的题目之一,特别是在面试中经常出现。这个问题的基本要求是将链表的节点顺序反转。

基本思路:

使用三个指针来反转链表:

​ 1. prev:指向当前节点的前一个节点。

​ 2. cur:指向当前节点。

​ 3. next:指向当前节点的下一个节点。

我们遍历链表,将每个节点的 next 指针指向前一个节点。

    public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;ListNode next = null;while (curr != null) {next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}

移除链表中的指定元素(Remove Linked List Elements)

值得注意:移除元素需要保留该节点的前一个节点。

    public ListNode removeElements(ListNode head, int val) {while (head != null && head.val == val) {head = head.next;}ListNode curr = head;ListNode prev = null;while (curr != null) {if (curr.val == val) {prev.next =curr.next;curr = prev.next;}else {prev = curr;curr = curr.next;}}return head;}

相关文章:

【算法刷题】链表

文章目录 环形链表判断是否有环找出环的入口位置 双指针反转链表(Reverse a Linked List)移除链表中的指定元素(Remove Linked List Elements) 环形链表 判断是否有环 环形链表是指链表中的某些节点的 next 指针指向了链表中的某…...

计算机网络 —— 网络编程实操(1)(UDP)

计算机网络 —— 网络编程实操(UDP) 套接字端口套接字的定义为什么需要套接字? 套接字的分类1. 按照通信协议分类2. 按照地址族(Address Family)分类3. 按照通信模式分类 socket APIsockaddr结构 使用接口套接字初始化…...

selenium 确保页面完全加载

在使用Python和Selenium进行Web自动化时,确保页面完全加载是非常重要的。为了实现这一点,Selenium提供了两种主要类型的等待:显式等待(Explicit Waits)和隐式等待(Implicit Waits)。此外&#x…...

[极客大挑战 2019]HardSQL 1

看了大佬的wp,没用字典爆破,手动试出来的,屏蔽了常用的关键字,例如:order select union and 最搞的是,空格也有,这个空格后面让我看了好久,该在哪里加括号。 先传入1’ 1试试&#…...

vip与haproxy构建nginx高可用集群传递客户端真实ip

问题 系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡,但是发现在上游的应用服务无法拿到客户端的请求ip地址,拿到的是主haproxy机器的ip,以下是nginx与haproxy的缩减配置: location ~* ^/(xx|xx) {proxy_pass http:/…...

Easticsearch介绍|实战?

Elasticsearch 是一个分布式的、RESTful 风格的搜索和数据分析引擎,适用于各种用例,如日志分析、全文搜索、实时应用监控等。它设计用来处理大量数据,并且可以快速地提供相关的搜索结果。以下是一些 Elasticsearch 的实战应用场景以及如何在这…...

Python图形界面(GUI)Tkinter笔记(二十一):Messagebox信息提示功能控件

messagebox 就像是 tkinter 库里的一个好帮手,它能帮你弹出各种各样的消息框给用户看。这些消息框可以告诉用户很多东西,比如提示、警告或者错误信息之类的。在 tkinter 库里,messagebox 这个模块有很多不同的函数,每个函数都能弹出一种特定的消息框。用这些函数,开发者可…...

vue3+ts+element-plus 表单el-form取消回车默认提交

问题描述:在表单el-form中的el-input中按回车后,页面会刷新,url也会改变, 回车前: 回车后: 相关代码: 解决方法1:在 el-form 上阻止默认的 submit 事件,增加 submit.pre…...

Web Services 简介

Web Services 简介 1. 引言 Web Services 是一种基于网络的软件服务,它允许不同的应用程序在互联网上相互通信和交互。这种技术是基于开放的互联网标准,如HTTP、XML、SOAP和WSDL,使得不同平台和编程语言的应用程序能够轻松地实现互操作性。Web Services 的出现,极大地推动…...

Vue3苦逼的学习之路

从一名测试转战到全栈是否可以自学做到,很多朋友肯定会说不可能,或就算转了也是个一般水平,我很认同,毕竟没有经过各种项目的摧残,但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容,大佬勿…...

AcWing练习题:两点间的距离

给定两个点 P1 和 P2,其中 P1P1 的坐标为 (x1,y1),P2 的坐标为 (x2,y2),请你计算两点间的距离是多少。 distance√(x2−x1)^2(y2−y1)^2 输入格式 输入共两行,每行包含两个双精度浮点数 xi,yi,表示其中一个点的坐标…...

文献分享:RoarGraph——跨模态的最邻近查询

文章目录 1. \textbf{1. } 1. 导论 1.1. \textbf{1.1. } 1.1. 研究背景 1.2. \textbf{1.2. } 1.2. 本文的研究 1.3. \textbf{1.3. } 1.3. 有关工作 2. \textbf{2. } 2. 对 OOD \textbf{OOD} OOD负载的分析与验证 2.1. \textbf{2.1. } 2.1. 初步的背景及其验证 2.1.1. \textbf{2…...

故事可视化AI

i68,爱六八,链接你我他 StoryWeaver故事可视化 通过知识增强的角色定制技术,实现高质量的故事可视化论文链接:https://arxiv.org/pdf/2412.07375项目仓库:https://github.com/Aria-Zhangjl/StoryWeaver由厦门大学多媒体可信感知与高效计算教育部重点实验室和网易伏…...

【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门

文章目录 【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门前言一、什么是机器学习?二、机器学习的基本类型1. 监督学习(Supervised Learning)2. 无监督学习(Unsupervised Learning)3. 半监督学习&a…...

ffmpeg八大开发库

‌FFmpeg八大库‌是指FFmpeg项目中最重要的八个库,它们各自承担不同的功能,共同构成了FFmpeg的强大功能。以下是这八大库的详细介绍: ‌libavcodec‌:负责音频和视频的编解码。它支持多种编解码器,如H.264、AAC、MP3、…...

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行...

Linux上安装配置单节点zookeeper

直接先去官网下载安装包, https://downloads.apache.org/zookeeper/ 选择合适的版本,然后上传至服务器 解压: tar -zxvf apache-zookeeper-3.9.3-bin.tar.gz创建data和logs目录 mkdir data mkdir logs配置环境变量: vim /etc/p…...

现代光学基础-1

总结自老师的讲义 yt1 目录 光纤通信系统 组成部分三大里程碑技术实例分析 激光器 定义自振荡器的特性组成输出特性应用领域 受激辐射、自然辐射与吸收 LASER的定义受激辐射的特点光与物质的相互作用能量守恒与材料特性净增益条件 谐振器 定义组成部分性能描述 F-P谐振器&am…...

pytorch中nn.Conv2d详解及参数设置原则

文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数?1. **in_channels 和 out_channels(输入…...

T-SQL语言的正则表达式

T-SQL语言的正则表达式 在现代数据库管理系统中,SQL(结构化查询语言)被广泛用于数据的操作与管理。对数据的查询、插入、更新和删除几乎是每一个数据库管理系统中的基本功能。T-SQL(Transact-SQL)是微软对SQL的扩展&a…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...