《代环问题》

代环问题

  • 什么是代环
    • 代环的结构
  • 怎么判断代环还是不代环呢?
  • 举一反三
    • 1:为什么一定会相遇,有没有可能会错过永远追不上? 请证明
    • 2:slow一次走一步,那么fast走3、4、5、6......n步可不可以?
    • N是奇数C是偶数时,那就永远追不上这个条件存在吗?
    • 找代环入口点
  • 总结

什么是代环

在这里插入图片描述

代环的结构

尾结点的next指针有可能指向任意的位置

怎么判断代环还是不代环呢?

1:要运用到快慢指针
慢指针走一步,快指针走俩步
2:当slow指针走到环中,那么就与fast指针形成追击问题(fast走俩步,slow走一步)期间fast在一步一步的追击slow,直到他们相遇
在这里插入图片描述

//函数实现
bool shfes(struct ListNode* head)
{
struct ListNode* slow=head,*fast=headl
while(fast&&fast->next)
{
slow=slow->next;//慢指针走一步
fast=fast->next->next;//快指针走俩步
if(slow==fast)
return true;
}
return flase;
}

举一反三

代环链表有很多的考点
比如:

1:为什么一定会相遇,有没有可能会错过永远追不上? 请证明

在这里插入图片描述
首先: 我们先设slow进环时与fast的差距是N.
那么我们就可以得知fast与slow的追击过程
N
经过一次后
N-1
经过俩次后
N-2
、、、、、、以此类推
经过N次后
这时他们刚好相遇

2:slow一次走一步,那么fast走3、4、5、6…n步可不可以?

fast走3步,slow走1步

当slow进环时那么与fast也形成了追击问题
fast与slow追击过程
我们设他们的差距是N
(N是偶数) (N是奇数)
N ----------------- N
N-2 -------------- N-2
N-4 -------------- N-4
… ----------------- …
4 ------------------3
2 ------------------1
0 ---------------- -1(这里表示fast指针超过了slow,错过了slow,要进入新一轮的追击)

那么我们设这个环的周长为C

错过了slow,进行新一轮的危机
距离变成C-1

再重复上述过程
1:现在的C-1变成了fast与slow指针的差距N
2:如果C-1是偶数,那么fast下一轮就追上了
3:如果C-1是奇数,那么fast就永远追不上了
(死循环)

复盘:
如果N是偶数,fast第一轮就追上了。
如果N是奇数,fast第一轮就错过了,
1:如果C-1是偶数,那么下一轮就追上了。
2:如果C-1是奇数,那么就永远追不上了。

N是奇数C是偶数时,那就永远追不上这个条件存在吗?

在这里插入图片描述

当slow进环时,fast已经在环中转了x圈了
fast走的距离:L+xC+C-N(转了x圈且多走C-N圈)
slow走的距离:L
fast指针一次走3步,而slow指针一次走1步
得知:
fast走的距离是slow的3倍
**L+x
C+C-N=3L
(x+1)C-N=2L*
左边2L是偶数那么右边也得是偶数

如果按照条件:N是奇数C是偶数
*偶数=(x+1)偶数-奇数------------>偶数=偶数-奇数
通过带入 可知:

这个条件:N是奇数C是偶数不成立!!!
总结
永远追不上的条件不成立!!!

找代环入口点

在这里插入图片描述
一个指针从fast与slow指针相遇点开始走和一个指针从头开始走

1:那么他们会在代环入口点相遇

         为什么呢?

在这里插入图片描述

相遇时slow走的路程:L+N
相遇时fast走的路程:L+xC+N (x>0)
当fast走俩步,slow走一步
2
(L+N)=L+xC+N
L+N=x
C

由这个推出来的公式:
L=x*C-N
带入x=1
L=C-N
在这里插入图片描述
无论当x=2、3、4、…也是C-N的距离
x=1
L=C-N
而slow与fast相遇点刚刚好是开始点

那么在由上面的图一个指针从头开始,另一个指针从相遇点开始都会相遇在代环入口点

总结

代环链表是面试时面试官常常问的问题,而单单了解代码怎么解是远远不够的还要了解代码的本质.
最后祝大家五一快乐(^▽ ^)!!!!!**

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 安装Python3.12.0

下载源文件。 wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz 解压。 tar -zxvf Python-3.12.0.tgz 进入文件夹。 cd Python-3.12.0 指定安装目录。 ./configure --prefix/usr/local/python3.12/ 1 编译,把源码包里面的代码编译成linux服务器可以…

【JAVASE】带你了解的方法魅力

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 …

自学Java要到什么程度才足够能力去实习和就业?

引言 Java,作为当今软件开发领域的主流编程语言之一,对于初学者而言,明确掌握到什么程度才能开始寻找实习和入职机会是至关重要的。这涉及到对Java知识体系的理解深度、技能掌握程度以及实际项目经验的积累。 本文将分别从实习和入职两个不…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x新特性) 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2 文…

Golang | Leetcode Golang题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; func generateMatrix(n int) [][]int {matrix : make([][]int, n)for i : range matrix {matrix[i] make([]int, n)}num : 1left, right, top, bottom : 0, n-1, 0, n-1for left < right && top < bottom {for column : lef…

PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头视频图像叠加

链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是视频水印&#xff1f; 视频水印就是图像叠加&#xff0c;跟画中画&#xff0c;或者是OSD是一样的原理&#xff0c;都是在视频的行场数据流上进行替换操作&#xff0c;比如叠加可以直接用水印图的数…

Vue.js课后练习(登录注册和大小比较)

第一题 请编写登录页面和注册页面&#xff0c;通过动态组件实现动态切换页面中显示的组件&#xff0c;效果如图1和图2所示。 图1 登录页面 图2 注册页面 代码&#xff1a; my.vue代码: <template>登录 </template><script setup> </script><st…

K8S执行完毕kubectl init xxx 执行 kubectl get ns 报错才connect: connection refused

问题场景&#xff1a; 在安装完毕K8S之后&#xff0c;执行 kubectl get ns 报错&#xff1a; [rootmaster ~]# kubectl get pods E0501 08:34:55.770030 11268 memcache.go:265] couldnt get current server API group list: Get "https://192.168.1.100:6443/api?ti…

RAGFlow:安装与体验

服务器需要有docker,或者直接访问官方提供的demo: https://demo.ragflow.io/ docker-compose安装 需要确保 vm.max_map_count 不小于 262144 【更多】:sysctl -w vm.max_map_count=262144 克隆仓库:$ git clone https://github.com/infiniflow/ragflow.git 进入 doc…

特殊成员的管理方法

五一假期第一天&#xff0c;快乐学习&#xff0c; 团队管理最困难的其实就是人的管理。 团队冲突往往是由一些特殊的成员引起的&#xff0c;因此&#xff0c;掌握这些特殊成员的管理方法不但可以减少团队冲突发生的频次&#xff0c;还会降低团队冲突解决的难度。 【我是中年老码…

卫星通信现状与展望三 -- 6G

作者:私语茶馆 6G星地一体远景规划 中国信通院《6G总体远景与潜在关键技术白皮书》指出6G将实现地面网络、不同轨道高度上 的卫星(高中低轨卫星)以及不同空域飞行器等融合而成全新的移动信息网络,通过地面网络实现城市热点常态化覆盖,利用天基、空基网络实现偏远地…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构&#xff1a;分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变&#xff0c;软件架构也需要同步进行升级&#xff0c;引入面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;简称 SOA&#xff09;方法论。…

【八大排序(三)】快速排序

❣博主主页: 33的博客❣ ▶️文章专栏分类:八大排序◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多排序知识 目录 1.前言2.快速排序2.1概念2.2画图理解2.3递归代码实现2.3.1Hoare法2.3.2挖坑法2.3.3前…

外包干了3天,技术就明显退步了。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

一个完全免费、私有且本地运行的搜索聚合器-FreeAskInternet

什么是 FreeAskInternet FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;使用 LLM 生成答案&#xff0c;无需 GPU。用户可以提出一个问题&#xff0c;系统将使用 searxng 进行多引擎搜索&#xff0c;并将搜索结果组合到 ChatGPT3.5 LLM 中&#xff0…

第三节课,功能2:开发后端用户的管理接口-- postman--debug测试

一、如何使用postman 网址&#xff1a; https://www.postman.com/downloads/ 【Postman小白教程】五分钟学会如何使用Postman~_哔哩哔哩_bilibili postman安装使用_bowser agent在postman哪里-CSDN博客 二、下载后 登录&#xff0c;开始测试 2.1 关于postman 报错&#…

什么是 Web3 的生成式 AI?

从 Web 1.0 的静态、单向通信到 Web 2.0 的动态、用户驱动的格局&#xff0c;互联网在二十年的时间里经历了一场显着的转变。现在&#xff0c;当我们站在 Web 3.0 时代的边缘时&#xff0c;我们正在见证更具颠覆性的事物的曙光&#xff1a;生成式人工智能 (AI) 融入我们的数字世…

【数据结构(邓俊辉)学习笔记】向量05——排序器

文章目录 0. 概述1.统一入口2. 起泡排序2.1 起泡排序&#xff08;基础版&#xff09;2.1.1 算法分析2.1.2 算法实现2.1.3 重复元素与稳定性2.1.4 复杂度分析 3. 归并排序3.1 有序向量的二路归并3.2 分治策略3.3 实例3.4 二路归并接口的实现3.5 归并时间3.6 排序时间 4.综合评价…

【Linux】体系结构和进程管理

目录 一、认识冯诺依曼体系结构 1.1 概念 1.2 组成 1.3 存储分级 1.4 有关冯诺依曼的问题 二、操作系统 2.1 概念和功能 2.2 如何理解操作系统的 "管理" 2.3 操作系统的用户、系统调用和库函数概念 三、进程 3.1 基本概念 3.2 描述进程-进程控制块PCB …

C语言:数据结构(双向链表)

目录 1、双向链表的结构2、顺序表和双向链表的优缺点分析3、双向链表的实现 1、双向链表的结构 注意&#xff1a;这⾥的“带头“跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了更好的理解就直接称为单链表的头节点。 带…
最新文章