数据结构 ——— 单链表oj题:环形链表

news2025/1/18 2:16:09

目录

题目要求

手搓简易环状单链表 

代码实现

问题1:slow 指针和 fast 指针一定会相遇吗

问题2:slow 每次走一步,fast 每次走 n 步是否还能判断链表带环?(n > 2) 


题目要求

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环,返回 true,否则返回 false


手搓简易环状单链表 

代码演示:

struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n1);
struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n2);
struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n3);
struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n4);

n1->val = 3;
n2->val = 2;
n3->val = 0;
n4->val = -4;

n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n2;

代码实现

代码演示:

bool hasCycle(struct ListNode* head)
{
	struct ListNode* slow = head;
	struct ListNode* fast = head;

	while (fast != NULL && fast->next != NULL)
	{
		slow = slow->next;
		fast = fast->next->next;

		if (slow == fast)
			return true;
	}

	return false;
}

代码解析:

利用快慢指针的思路解决,slow 指针一次走一步,fast 指针一次走两步,当 slow 指针的地址和 fast 指针的地址相同时,就说明链表是环状链表,否则 fast 指针就会走到 NULL

代码验证:

是环状链表时:

不是环状链表时:


问题1:slow 指针和 fast 指针一定会相遇吗

解答:

在 slow 指针一次走一步,fast 指针一次走两步的情况下,一定会相遇
fast 会先进入环中,slow会后进入,假设 slow 进入环后,fast 和 slow 的距离为 N
那么 fast 每走两步,slow 每走一步,距离 N 就会递减 1
N 的值一直递减 1 ,直到最后 N 的长度为 3……2……1……0
当 N 的长度为 0 时,就说明 slow 和 fast 指针相遇了
且 N 为正整数,那么只要是递减 1 ,就一定会递减到 0,所以 slow 和 fast 就一定会相遇


问题2:slow 每次走一步,fast 每次走 n 步是否还能判断链表带环?(n > 2)

解答:

当 slow 每次走一步,fast 每次走 3 步时,不一定会相遇
fast 会先进入环中,slow会后进入,假设 slow 进入环后,fast 和 slow 的距离为 N
那么 slow 每次走一步,fast 每次走 3 步,他们的距离就会缩小 2
也就是 N 的值一直递减 2,就会出现两种情况
情况1:当 N 为偶数时,每次递减2,直到最后 N 的长度为 4……2…… 0(会相遇)
情况2:当 N 为奇数时,每次递减2,直到最后 N 的长度为 3……1……-1(会错过)
且错过后,假设环的长度为 C ,那么 fast 和 slow 的距离就是 C - 1
那么此时 当 C-1 为偶数时,fast 和 slow 就会相遇,否则就永远都不会相遇

当 fast 每次走 4 步时也是一样的,假设 slow 进环后,距离为 N
slow 每走一步,fast 每走 4 步,就会缩小 3 步
那么只有当 N 的值是 3 的倍数时,slow 和 fast 才会相遇,其他情况就不会相遇

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

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

相关文章

【翻译】在 Python 应用程序中使用Qt Designer的UI文件

原文地址:Using a Designer UI File in Your Qt for Python Application 直接上图,上代码 将UI文件转为Python To demonstrate, we use the Qt Widgets animation easing example. 为了演示,我们使用 Qt Widgets 动画简化示例。 这个应用程…

快递查询软件:实现单号识别与批量物流查询的高效工具

随着网络购物的普及,快递物流行业迎来了前所未有的发展机遇,同时也面临着巨大的挑战。跟踪物流信息成为一个难题,因此,快递查询软件的核心功能之一便是单号识别。传统的快递单号输入方式繁琐且易出错在此背景下,快递查…

游戏盒子推广全攻略:从用户洞察到策略实施

在移动互联网时代,游戏盒子的推广已经成为众多游戏代理商和开发者的重要课题。面对激烈的市场竞争,如何高效吸引并留住玩家,成为游戏盒子推广的关键。本文将结合Xinstall这一专业App推广工具,探讨游戏盒子推广的有效策略。 一、市…

详细分析Java8中的StringJoiner | 对比StringBuilder(附Demo)

目录 前言1. 差异对比2. 基本知识3. 源码分析4. Demo 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 差异对比 展…

多种方式确定Linux是CentOS还是Ubuntu

目录 前言正文 前言 对应的基本知识比较少,以下只是记录总结 由于目前使用的是centos,后续找到linux会对应补充 正文 要确定Linux系统是CentOS还是Ubuntu,可以通过以下几种方式进行分析 一、查看发行版信息文件: CentOS&…

UE5运行时动态加载场景角色动画任意搭配-角色及动画(一)

通过《MMD模型及动作一键完美导入UE5》系列文章,我们可以把外部场景、角色、动画资产导入UE5,接下来我们将实现运行时动态加载这些资产,并任意组合搭配。 1、骨骼动画复用 1、大部分模型骨骼是不通用的,比如这些裙子也是有骨骼的,属于模型特有的,但是对于动画来说,很多…

【实时计算 Flink】SQL作业大状态导致反压的调优原理与方法

状态管理不仅影响应用的性能,还关系到系统的稳定性和资源的有效利用。如果状态管理不当,可能会导致性能下降、资源耗尽,甚至系统崩溃。本文为您介绍SQL作业大状态导致反压的调优原理与方法。 运行原理:状态算子的产生 作为一种特…

面试题:Redis(二)

1. 面试题 2. MoreKey案列 事故案例 2.1 生成上如何限制key*/flushdb/flushall等危险命令的使用? 通过redis.conf配置文件中在SECURITY选项中禁用这些命令 2.2 不用key*避免卡顿那用什么? 用scan命令,类似mysql中的limit命令 语法&…

数学建模算法与应用 第2章 整数规划及其求解方法

目录 2.1 概述 2.2 0-1整数规划模型 2.3 分枝定界法(Branch and Bound) 2.4 蒙特卡洛法(随机取样法) Matlab代码示例:蒙特卡洛法求解简单整数规划 2.5 整数规划的计算机求解工具 习题 2 总结 整数规划是线性规…

Window11 安装Java21教程

随着Java版本的迭代,最新的长期支持版本已经更新到Java21了,虽然笔者许多代码还是当年用Java8写的,但抱残守缺从来不适合IT人员,该来的我们始终要欣然面对。 其实随着各项技术的发展,Java许多组件现在其实都不需要或者…

Authentication Lab | Client Side Auth

关注这个靶场的其它相关笔记:Authentication Lab —— 靶场笔记合集-CSDN博客 0x01:Client Side Auth 前情提要 有些时候,开发人员会将身份验证的逻辑写于前端,这样写是十分不安全的,因为前端的代码几乎全部都是可见的…

借助微软 Teams 中的 Tableau,加速数据驱动型决策与协作流程

Tableau 应用已正式上线 Teams 商店!如此,企业就能以一种更可靠和安全的方式在 Teams 中共享数据见解。 让团队能快速协作做出数据驱动型决策不再是可选项,而是业务成功的必备条件。 在几个月前的TC24 大会上,Tableau 再次表明了…

关于Amazon Linux 2023的版本及包管理器

在亚马逊上创建EC2实例时,会看到有一个Amazon Linux镜像。 那这个镜像与其他Linux有什么关系和区别呢? 网站是介绍:Amazon Linux 2023 是基于 Linux 的现代化通用操作系统,提供 5 年的长期支持。它针对 AWS 进行了优化&#xff0…

Stable Diffusion最新版nowebui的api使用详解

最近在使用stable diffusion最新版的Stable Diffusion WebUI Forge进行api调用,下面来一步一步的进行展开吧!!! 1、下载lllyasviel/stable-diffusion-webui-forge GitHub - lllyasviel/stable-diffusion-webui-forgeContribute to lllyasviel/stable-diffusion-webui-for…

gaussdb hccdp认证思考题01 GaussDB数据库介绍

01_GaussDB数据库介绍 1. (判断题)gsql是一款运行在Windows操作系统上的图形界面SQL客户端工具,用于连接GaussDB集群中的数据库以及管理数据库对象。 --错。

120页满分PPT | 企业级业务架构和IT架构规划方案

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路,包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤,旨在通过这些步骤完成现状及差距分析,并基于此设计未来的应用架构、数据架构…

应用UX体验标准

1、应用导航 标准编号 2.1.1.1 系统返回 标准描述 所有界面都可以执行系统返回操作。 除一级界面外,所有全屏界面均需要提供返回/关闭/取消按钮。(全屏沉浸式场景除外) 测试方法 使用侧边返回手势,验证当前应用界面是否可以执行系统返回操作。检查…

ML 系列:机器学习和深度学习的深层次总结(14) — 逻辑回归(第 3 部分 — 实施)

目录 一、说明 二、数据集说明 三、探索性数据分析 3.1. 查找 null 值 3.2. 数据预处理 3.3. 独特价值 3.4. 两种类型(恶性、良性)之间的数据传播 3.5. 特征选择和降维 3.5.1.特征选择 3.5.2 降维 (PCA) 3.6. 选择数据的两个重要特…

【测试】——Loadrunner 介绍与使用

📖 前言:LoadRunner是一款开源桌面应用软件,可用来模拟用户负载完成性能测试工作,LoadRunner的功能在版本不断升级的过程中已经十分强大,现在很多互联网公司都在使用LoadRunner来完成产品或者Loadrunner是业界公认的权…

纠删码参数自适应匹配问题ECP-AMP实验方案(二)

6.方法设计 6.1.数据获取 为了收集不同的文件大小和纠删码参数对性能指标的影响,本文在Hadoop平台上进行了模拟实验。Hadoop是一种开源的分布式存储和计算框架,它可以支持不同类型的纠删码,并提供了一些应用程序接口和工具来测试和评估纠删…