面试经典算法系列之链表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,一经查实,立即删除!

相关文章

【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;仅代表只能够在当前本机访问&…

深入浅出 -- 系统架构之微服务中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…

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…

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…

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写的&…

uniapp开发小程序,点击右上角<重新进入小程序>进行刷新时,设置开屏加载页面

一、需求及问题 问题&#xff1a;使用uniapp开发小程序时&#xff0c;有【学生端】和【企业端】两个入口&#xff0c;一进入小程序默认进入【学生端首页】&#xff0c;但是当前处于【企业端】时&#xff0c;点击右上角<重新进入小程序>进行刷新时&#xff0c;页面默认进…

国内如何实现GPT升级付款

本来想找国外的朋友代付的&#xff0c;但是他告诉我他的信用卡已经被绑定了他也升级了所以只能自己想办法了。就在一位博主下边发现了这个方法真的可以。只是需要与支付宝验证信息。刚开始不敢付款害怕被骗哈哈&#xff0c;我反诈骗意识绝对杠杠的 该方法就是我们办理一张虚拟…

每天五分钟深度学习PyTorch:面对Tensorflow,为何我选择PyTorch

这篇专栏文章不是为了挑起tenserflow和pytorch中哪个更好&#xff0c;众所周知tensorflow诞生以来&#xff0c;已经成为最流行的深度学习框架&#xff0c;可以说github中大多数的深度学习代码实现是以tensorflow实现的&#xff0c;也就是说资源众多&#xff0c;社区强大&#x…

还不会免费将PDF转为Word?赶快试试这3种工具!

PDF文档格式转换是高频且刚需的办公需求&#xff0c;虽然很简单&#xff0c;但其实绝大部分人找不到合适的工具。 将PDF免费转为Word的方法有很多&#xff0c;这里主要介绍三种工具。 第一种使用最常见的Word软件&#xff0c;第二种使用免费转换网站pdf2doc&#xff0c;第三种…

AI论文精读之CSPNet—— 一种加强CNN模型学习能力的主干网络

目录 一、论文摘要部分 二、提出背景 三、本文的方法 3.1 DenseNet 3.2 Cross Stage Partial DenseNet 3.3 引入 partial dense block及partial transition layer的目的 3.3.1 partial dense block 3.3.2 partial transition layer 3.4 将CSPNet应用到其他结构中 3.5 E…

比nestjs更优雅的ioc:跨模块访问资源

使用ts的最佳境界&#xff1a;化类型于无形 在项目中使用ts可以带来类型智能提示与校验的诸多好处。同时&#xff0c;为了减少类型标注&#xff0c;达到化类型于无形的效果&#xff0c;CabloyJS引入了ioc和依赖查找的机制。在上一篇文章中&#xff0c;我们创建了一个业务模块t…

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)

一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…