带环链表及例题

环形链表,链表中的尾节点指向链表中的某个节点导致形成循环的链表。

通过图可以这样表示。

我们一般采用快慢指针的方式解决带环链表的题目,下面直接上例题

环形链表

力扣链接:

. - 力扣(LeetCode)

让我们判断一个链表是否为环形链表。

思路:

如果不是循环链表,最终会指向NULL

而如果是循环链表

1.快指针会比慢指针先进入环形链表。

2.快指针速度会比慢指针快一个单位,因此两个指针每次移动都会拉近一个距离。

3.当两个指针相等时,说明是环形链表。

参考代码:

思考:

若快指针速度为2,3,甚至n时,能否解决该问题。

其实这是一个数学问题

假设快指针速度为n。
快指针进入循环后需要追击慢指针的长度为m
循环长度为C
慢指针遇到快指针时的运动长度为L
以上参数均为整数
那么我们可以写出以下式子:
nL=L+x*C+C-m    (x为快指针进入循坏时的运动圈数,大于0)
(n-1)L=(x+1)*C-m
L=[(x+1)*C-m]/(n-1)

其中(C为固定的,x可以取任何大于0的值,L,m均为整数),实现该条件即可

n为2即快指针速度为2时可以满足所有的情况

以n=3为例子

需要(x+1)*C-m为偶数

当C为奇数时,由于x+1可以为任意值,所以(x+1)*C既可以为奇数也可以为偶数,无论m为何值均可均成立

当C为偶数时,(x+1)*C只能为偶数,那么m则必须为偶数才能成立。

随机链表的复制

力扣链接:

. - 力扣(LeetCode)

思路:

我们可以在原先每个节点之后都创建上一个新节点并与原链表串起来

那么如果random指向NULL则原节点的后一个位置即为我们创建的对应的节点,这个节点的random也指向NULL

如果原节点不指向NULL,则指向原节点的random节点的下一个位置(即我们创建的与该节点对应的节点)

串完之后将我们创建好的链表从中取出即可

参考代码:

环形链表2

力扣链接

. - 力扣(LeetCode)

思路:
 

这道题也是一个数学问题

我们假设:
头节点到循环的起始位置之间的距离为a
相遇位置到起始位置的距离为b
起始位置到相遇位置的距离为c
慢指针速度为1
快指针速度为2
那么慢指针到相遇位置移动长度为slow=a+ib+c
快指针到相遇位置移动长度为fast=a+jb+c
那么fast=2*slow
即a+jb+c=2*(a+ib+c)
即c=(j-2i)b-a
我们可知相遇位置只要再移动a个单位即可到达循坏位置开始的(j-3i)b位置,即起始位置
那么我们就让头节点和慢指针一起移动,头节点和慢指针移动a个单位后均会到达起始位置,也就是相遇

参考代码:

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

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

相关文章

JAVA同城服务美容美发到店服务上门服务系统源码微信小程序+微信公众号+H5+APP

随着科技的飞速发展,互联网和移动互联网已经渗透到我们生活的方方面面,同城服务美容美发到店服务上门服务系统应运而生,为整个行业带来了巨大的变革和无限的可能。该系统的重要性和优势不言而喻,对于行业发展和用户需求的影响深远…

偏自相关系数的等价定义

第k个回归系数的值 原始定义

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…

嵌入式全栈开发学习笔记---vim编辑器

目录 进入vim编辑器 Shiftzz退出编辑器 vim的三种模式 命令模式 插入模式 yy复制一行 p粘贴一行 nyy复制多行 dd剪切一行 ndd剪切多行 x删除一个字符 nx删除多个字符 u撤销上一次操作 shiftg从第一行如果快速调到最后一行 gg回到第一行 pagedown & pageup往…

Java同时使用@RequestBody和@RequestParam传参在postman中执行请求报错:Unsupported Media Type

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

快速体验 Spring Cloud Alibaba AI

快速体验 Spring Cloud Alibaba AI Spring AI 旨在简化包含人工智能相关功能的应用程序的开发&#xff0c;避免不必要的复杂性。 Spring AI 的核心是提供抽象&#xff0c;作为开发 AI 应用程序的基础。这些抽象有多种实现方式&#xff0c;只需极少的代码改动即可轻松实现各个…

【QT学习】11.TCP协议

一。【window为例】TCP协议的解释&#xff08;记忆方法&#xff09; 物理结构&#xff08;自己理解&#xff09; 1.服务器端 服务器端&#xff1a; 首先使用套接字函数创建 套接字 &#xff08;Socket&#xff09;&#xff0c;并使用 绑定 函数绑定到本地地址&#xf…

MobileNetV4 论文学习

论文地址&#xff1a;https://arxiv.org/abs/2404.10518 代码地址&#xff1a;https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobilenet.py 解决了什么问题&#xff1f; 边端设备的高效神经网络不仅能带来实时交互的体验&#xff0c…

STL复习

vector STL详解及常见面试题_stl常见面试题-CSDN博客 C vector中resize()和reserve()区别_c vector resize和reserve区别-CSDN博客 释放vectro内存&#xff1a; map释放内存 deque&#xff1a; C STL deque 容器底层实现原理&#xff08;深度剖析&#xff09; - 知乎 (zhihu.…

python项目入门新手攻略

最近工作需要接手了代码量比较大的python开发的项目&#xff0c;平时写python不多&#xff0c;记录一下如何熟悉项目。 分析调用流程-pycallgraph 因为代码量比较大&#xff0c;所以希望通过工具生成代码调用流程&#xff0c;因此用到了pycallgraph。 pycallgraph&#xff0…

绿色低碳深入业务全生命周期 顺丰同城发布2023ESG报告

近年来&#xff0c;作为一种国际公认的可持续发展理念&#xff0c;强调生态环境保护、履行社会责任、提高治理水平的ESG成为衡量长期投资价值的重要维度之一。今年恰逢联合国契约组织提出ESG概念20周年&#xff0c;“ESG”从首次进入公众视野至今&#xff0c;现在已成为各国商业…

基于SpringBoot的“在线BLOG网”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线BLOG网”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 在线BLOG网结构功能图 管理员登录功能界面 用户信息…