环形链表题

1.环形链表1

看题:. - 力扣(LeetCode)

思路1:哈希表

遍历所有节点,每次遍历一个节点时,判断该节点是否被访问过。

可以使用哈希表来存储所有已经访问过的节点。每次到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表。

思路2:快慢指针

创建两个指针,一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步,如果是环形链表则两个指针会相遇,所以每走一次判断两个指针是否相等。如果不是环形链表则快指针会走到NULL。

1.1.快慢指针

看图:

代码实现:

bool hasCycle(struct ListNode *head) {struct ListNode *fast=head;struct ListNode *slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){return true;}}return false;
}

2.环形链表2

看题:. - 力扣(LeetCode)

目录

1.环形链表1

1.1.快慢指针

2.环形链表2


思路1:快慢指针

先上结论:下面是一个环形链表,node结点位是快慢指针相遇的位置结点,phead是入环结点。

其中L的长度等于M的长度,知道这个结论后代码就信手拈来了。

下面是证明L=M:

如果是环形链表那么两个指针会相遇,找到相遇的节点node:

那么如图设置:head到入环的结点的长度为L,入环到相遇的结点node的长度为N,环的长度为C:

那么开始遍历链表,当然慢指针slow入环时快指针已经在环里走了至少一圈,假设为x圈,

当快慢指针相遇时,慢指针在环里面走的长度就是N,因为快指针的相对于慢指针的速度为1,所以每走一步快指针就与慢指针的距离-1,直到相遇。

此时

快指针走的路程:L+N+x*C

慢指针走的路程:L+N

因为快指针的速度是慢指针的两倍,所以路程也是慢指针的两倍。

所以:

L+N+x*C=2*(L+N)

整理一下:

L=x*C-N

处理:

L=(x-1)*C+C-N

式中当x取最小值时:L=C-N

而黑色部分长度就是C-N

此时让head遍历链表,node也开始往下走,当x取的值不是1时,node结点会一直在环里遍历,最终head和node一定会在入环结点相遇。

2.1代码
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *slow=head;struct ListNode *fast=head;struct ListNode *node=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==fast)break;}if(fast==NULL||fast->next==NULL)return NULL;while(fast!=node){fast=fast->next;node=node->next;}return fast;
}

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

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

相关文章

win10安装DHCP服务--用于2台机器之间搭建简易网络来进入目标机器修改配置

前言: 客户多了,往往会出现各种突发情况。 比如一个客户现场没有DHCP,没有显示器,键盘。 你只有一台笔记本的情况下要配置目标机器的网络。要如何配置?? 这时候就可以使用这篇博客提供的方式了。 Windows…

http1.1和http2.0的同源请求数限制

判断协议版本 :scheme: 在请求头中表示使用的是HTTP/2协议。即 出现 :开头的请求头Chrome 只支持查看 HTTP/1.x 的 Raw Headers,对这种请求,会给出 view source 选项。HTTP2.0不给出。可继续学习 https://www.cnblogs.com/kirito-c/p/10360868.html抓包…

update_min_vruntime()流程图

linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单,总一句话,将 cfs_rq->min_vruntime 设置为: max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。 画个流…

沐风老师3DMAX一键生成桌子插件TableMaker使用方法

3DMAX一键生成桌子插件TableMaker使用教程 3DMAX一键生成桌子插件TableMaker,参数化方式快速创建各种样式桌子模型。 【适用版本】 3dMax2011-2025(不仅限于此范围) 【安装方法】 3DMAX一键生成桌子插件无需安装,使用时直接拖动…

Electron+Vue3+Vite+ElectronForge整合 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发; Electron : 使用 JS 的语法开发。本文将从项目初始化开始,一步一步的完成项目的启动、打包全流程的介绍。实现的效果是 : 1、一个正常…

一个好用的MQTT客户端软件

软件功能如下,实现的协议版本是 3.1.1 仅实现了常用的 CONNECT , PUBLISH , SUBSCRIBE 及相应的应答报文。支持以 Hex 格式显示接收的原始报文(方便初学者学习)。支持所有字段的自定义配置。支持保存与加载配置文件。 软件界面如下所示&…

惠普M1136经常卡纸然后报错E0故障检修

惠普M1136显示故障码E0可能意味着打印机出现了传感器问题。传感器是负责检测纸张进出的装置,如果传感器出现问题,可能会导致打印机无法正确识别纸张,出现卡纸、断纸等问题,也可能会导致硒鼓无法正常运行;E0故障码通常表…

高效管理微信客户的三个方法,你掌握了吗?

随着互联网的发展,越来越多的人开始在微信上和客户进行交流,维护与客户的关系。 今天,就给大家分享三个高效管理微信客户的方法,让大家能更好地维护客户。 1、备注详细的资料 通过为每个客户添加详细的备注信息,我们…

Spring生命周期(二)

1. Processor和Aware 1.1 Processor 上一篇介绍的PostConstruct和PreDestroy是由Spring框架来读取的,并在Bean生命周期的相应阶段调用注解标记的方法,那么Spring框架具体是如何实现这些调用的呢?想要理解这个问题的答案,需要先了…

基因组坐标转换,hg19 hg38 T2T相互转

在线工具1: https://genome.ucsc.edu/cgi-bin/hgLiftOver 支持输入格式, Positions: chr8:141310715 chr8-141310715 chr8 141310715Variants: chr8:141310715 T>G chr8-141310715-T-G NM_001089.3(ABCA3):c.875A>T (p.Glu292Val)Intervals: chr8:141310715-141310…

使用numpy基于全连接层实现Minst数据集训练——待续

PS:本贴还没完全写完,全部代码直接转至文末,有时间会一点一点把细节部分解释清楚 题外话:以前习惯调包实现网络,然后发现研究新的较为复杂的网络结构会很吃力,于是回过头来垒实基础,后续会在全连…

力扣82-链表、迭代 的思考

题目解读 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 两个示范 思考 返回链表:返回更新链表后的头结点; 更新链表:判断重复元素,改变指针…