面试经典算法系列之链表2 -- 环形链表

面试经典算法8-环形链表

LeetCode.141
公众号:阿Q技术站

问题描述

给你一个链表的头节点 head ,判断链表中是否有环。

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

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例 1:

img

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

img

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

img

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引

**进阶:**你能用 O(1)(即,常量)内存解决此问题吗?

思路

  1. 定义两个指针 slowfast,初始时都指向链表的头节点 head
  2. slow 每次向后移动一个节点,fast 每次向后移动两个节点。这样,如果链表中有环,fast 最终会追上 slow
  3. 如果 fastnullptr 或者 fast->nextnullptr,则说明链表中不存在环,返回 false
  4. 如果 fastslow 相遇,则说明链表中存在环,返回 true

图解

这里根据示例1给大家做一个图解演示。

  1. 初始化,定义两个指针 slowfast,初始时都指向链表的头节点 head

image-20240130212914475

  1. slow 每次向后移动一个节点,fast 每次向后移动两个节点。

image-20240130213848438

  1. 继续移动

image-20240130214021817

  1. 继续移动

image-20240130214125618

此时, fastslow 相遇,说明链表中存在环,返回true。

如果 fastnullptr 或者 fast->nextnullptr,则说明链表中不存在环,返回 false

参考代码

C++
#include <iostream>// 定义链表节点结构
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:bool hasCycle(ListNode *head) {// 定义快慢指针,并初始化为链表头节点ListNode *slow = head;ListNode *fast = head;// 使用快慢指针判断链表中是否存在环while (fast != nullptr && fast->next != nullptr) {slow = slow->next;       // 慢指针每次移动一步fast = fast->next->next; // 快指针每次移动两步if (slow == fast) {      // 如果快慢指针相遇,说明存在环return true;}}// 如果快指针到达链表尾部,说明不存在环return false;}
};int main() {// 创建一个有环的链表ListNode *head = new ListNode(3);head->next = new ListNode(2);head->next->next = new ListNode(0);head->next->next->next = new ListNode(-4);head->next->next->next->next = head->next; // 尾节点连接到第二个节点,形成环Solution sol;std::cout << std::boolalpha << sol.hasCycle(head) << std::endl; // 输出 true,表示链表中存在环// 释放链表内存ListNode *curr = head;while (curr != nullptr) {ListNode *temp = curr;curr = curr->next;delete temp;}return 0;
}
Java
class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}
}public class Solution {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;}
}public class Main {public static void main(String[] args) {// 创建一个有环的链表ListNode head = new ListNode(3);head.next = new ListNode(2);head.next.next = new ListNode(0);head.next.next.next = new ListNode(-4);head.next.next.next.next = head.next; // 尾节点连接到第二个节点,形成环Solution sol = new Solution();System.out.println(sol.hasCycle(head)); // 输出 true,表示链表中存在环}
}
Python
class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:# 定义快慢指针,并初始化为链表头节点slow = headfast = head# 使用快慢指针判断链表中是否存在环while fast and fast.next:slow = slow.next       # 慢指针每次移动一步fast = fast.next.next  # 快指针每次移动两步if slow == fast:       # 如果快慢指针相遇,说明存在环return True# 如果快指针到达链表尾部,说明不存在环return False# 创建一个有环的链表
head = ListNode(3)
head.next = ListNode(2)
head.next.next = ListNode(0)
head.next.next.next = ListNode(-4)
head.next.next.next.next = head.next  # 尾节点连接到第二个节点,形成环sol = Solution()
print(sol.hasCycle(head))  # 输出 True,表示链表中存在环

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

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

相关文章

flask 后端 + 微信小程序和网页两种前端:调用硬件(相机和录音)和上传至服务器

选择 flask 作为后端&#xff0c;因为后续还需要深度学习模型&#xff0c;python 语言最适配&#xff1b;而 flask 框架轻、学习成本低&#xff0c;所以选 flask 作为后端框架。 微信小程序封装了调用手机硬件的 api&#xff0c;通过它来调用手机的摄像头、录音机&#xff0c;…

【C++成长记】C++入门 |函数重载、引用、内联函数

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、函数重载 1、函数重载概念 二、引用 1、引用概念 2、引用特性 3、常引用 4、使用场景 5、…

数据库之DCL操作(用户、访问权限。)

DCL英文全称是Data control language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1.管理用户 1.1查询用户 select * from mysql.user; 其中 Host代表当前用户访问的主机&#xff0c;如果为localhost&#xff0c;仅代表只能够在当前本机访问&…

Synergy错误: NOTE: Cursor is locked to screen, check Scroll Lock key

错误&#xff1a; NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is…

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法&#xff0c;Ribbon 提供了客户端负载均衡&#xff0c;而 RestTemplate 则对 http 进行封装&#xff0c;简化了发送请求的流程&#xff0c;两者互相配合&#xff0c;构建了服务间的高可用通信。 但在使用后也会发…

谁在投资“元素周期表”? 顶级芯片制造商“军备竞赛”

有色和商品基金的大买家何在 投资A股&#xff0c;有时候投资的也是一种“玄妙”的境界。 你需要复习金融知识、复习经济知识&#xff0c;复习科技知识&#xff0c;学习财政学、学习人口学、学习传染病学。 但这些可能还不够。 你能想象么有朝一日&#xff0c;你会回头复习中…

Flask项目如何在测试环境和生产环境部署上线

前言 最近在使用Flask框架&#xff0c;写一个小项目&#xff0c;在项目部署启动后&#xff0c;出现了以下这段提示&#xff0c;这段提示的意思是&#xff0c;该启动方式适用于开发环境中&#xff0c;生产环境要使用WSGI服务器。 WARNING: This is a development server. Do no…

阿里云大学考试Java中级题目及解析-java中级

阿里云大学考试Java中级题目及解析 1.servlet释放资源的方法是&#xff1f; A.int()方法 B.service()方法 C.close() 方法 D.destroy()方法 D servlet释放资源的方法是destroy() 2.order by与 group by的区别&#xff1f; A.order by用于排序&#xff0c;group by用于排序…

从0到1一步一步玩转openEuler--02 openEuler操作系统的安装

从0到1一步一步玩转openEuler–02 openEuler操作系统的安装 安装地址&#xff1a;https://www.jianshu.com/p/f8b8c7b4cc11

OSCP靶场--Zino

OSCP靶场–Zino 考点(CVE-2019-9581 RCE 定时任务脚本可写提权) 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.64 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-10 04:18 EDT Nmap scan report for 192.…

自定义注解进行数据转换

前言&#xff1a; Java注解是一种元数据机制&#xff0c;可用于方法&#xff0c;字段&#xff0c;类等程序上以提供关于这些元素的额外信息。 以下内容是我自己写的一个小测试的demo,参考该文章进行编写&#xff1a;https://blog.csdn.net/m0_71621983/article/details/1318164…

【linux】基础IO(四)

在上一篇基础IO中我们主要讲述了文件再磁盘中的存储&#xff0c;当然我们说的也都只是预备知识&#xff0c;为这一篇的文件系统进行铺垫。 目录 搭文件系统的架子&#xff1a;填补细节&#xff1a;inode&#xff1a;datablock[]: 更上层的理解&#xff1a; 搭文件系统的架子&a…

dynamicreports示例

1. 简单段落文本报表 //标题样式StyleBuilder titleStyle DynamicReports.stl.style().setHorizontalTextAlignment(HorizontalTextAlignment.CENTER)//设置对齐方式.setFontSize(50)//设置字体.setBackgroundColor(Color.CYAN);//设置背景颜色//段落样式StyleBuilder paragra…

uniapp 2.0可视化工具:创建与管理Vue文件的实践之旅

引言 在前端开发领域中&#xff0c;Vue以其简洁、易上手的特点&#xff0c;受到了广大开发者的青睐。随着uniapp的不断发展&#xff0c;越来越多的开发者开始利用uniapp的可视化工具来创建和管理Vue文件&#xff0c;以提高开发效率。本文将详细介绍如何使用uniapp 2.0可视化工…

bytetrack复现

一,环境安装 创建虚拟环境 conda create -n bytetrack python=3.8 安装requirements pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 可能报错,解决办法,安装numpy 安装 pytorch pip install torch==1.12.0+cu113 torchvision==0.13.0+cu1…

redis修改协议改了,有哪些替代品?

Redis 是一款广泛使用的开源内存数据结构存储&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。然而&#xff0c;由于 Redis 最近更改了其开源许可证&#xff0c;一些用户和开发者可能正在寻找替代品。以下是一些 Redis 的替代品&#xf…

解决vue3+ts组件ref定义但是访问不到组件属性

为什么父组件访问不到属性呢 因为使用 <script setup> 语法糖的组件是默认关闭的&#xff0c;也即通过模板 ref 或者 $parent 链获取到的组件的公开实例&#xff0c;不会暴露任何在 <script setup>中声明的绑定。 所以要自己抛出去 解决 为了在 <script setu…

H5动效开发之CSS3动画

动画效果是情感设计的重要手段,在H5开发中,实现动效需要综合利用 JavaScript、CSS(3)、SVG、Canvas 等多种 Web 技术手段才能开发出动人的网页动态效果。 接下来,我们把重心放在 CSS3 动画上面,因为 CSS3 在现如今的网页动效开发中占据着最为重要的一席,作为老大哥 CSS 的…

基于SSM+Jsp+Mysql的超市管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

SuperMap GIS基础产品FAQ集锦(202403)

一、SuperMap GIS基础产品桌面GIS-FAQ集锦 问题1&#xff1a;【iDesktop】安装了idesktop 11i&#xff0c;现想进行插件开发&#xff0c;根据安装指南安装SuperMap.Tools.RegisterTemplate.exe&#xff0c;运行多次均失败 【问题原因】该脚本是之前老版本针对VS2010写的&…