C/C++ BM6判断链表中是否有环

文章目录

  • 前言
  • 题目
  • 解决方案一
    • 1.1 思路阐述
    • 1.2 源码
  • 解决方案二
    • 2.1 思路阐述
    • 2.2 源码
  • 总结

前言

做了一堆单链表单指针的题目,这次是个双指针题,这里双指针的作用非常明显。


题目

判断给定的链表中是否有环。如果有环则返回true,否则返回false。

数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000
要求:空间复杂度 O(1),时间复杂度 O(n)

输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。

例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:
在这里插入图片描述
示例1
输入:{3,2,0,-4},1
返回值:true
说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true

示例2
输入:{1},-1
返回值:false
说明:第一部分{1}代表一个链表,-1代表无环,组成传入head为一个无环的单链表,返回false

示例3
输入:{-1,-7,7,-4,19,6,-9,-5,-2,-5},6
返回值:true

解决方案一

1.1 思路阐述

采用双指针法。

对于一个链表,链表中的节点的值可能会相同,所以我们很难通过值来判断是否有环。但是在链表中,每一个链表节点在内存中的地址是不一样的,所以我们比较节点与节点之间的地址信息。

双指针法:一个指针fast每次间隔一个节点进行遍历,一个指针slow每次按序遍历。通常,间隔遍历的指针fast会首先到达链表表尾,或者表尾的下一个指针即nullptr。那么如果对于有环的情况,fast会再次回到它所指的前面的节点;slow指针按序遍历,依次前进一个,如果链表没有环,那么slow和fast都会到达链尾。如果有环,fast一定会到达slow所指的节点位置。

这里打个比方,A和B同时在400m跑道上赛跑,A跑得快,B跑的慢。同时起跑,A跑的比B快,AB之间的距离不断拉大,A到后面超过B一圈了,那么超过B一圈的时候,A和B又在跑道上碰上了。这就是我上面写的如果有环,fast一定会到达slow所指的节点位置。

对于循环的终止条件:我们只需要判断fast指针是否遍历到链尾或者链尾的后一个节点空指针。

1.2 源码

#include <cstddef>
class Solution {
public:bool hasCycle(ListNode *head) {if(!head)return false;ListNode *fast=head;ListNode *slow=head;//这里nullptr和NULL效果一样,但在某些地方有点不同,可以查一下互联网//while (fast!=nullptr&&fast->next!=nullptr) {while (fast!=NULL&&fast->next!=NULL) {fast=fast->next->next;slow=slow->next;if(fast==slow)return true;}return false;}
};

解决方案二

2.1 思路阐述

思路一是用双指针,思路二就是哈希了。

在C++中的STL有一个set容器,在C++中,std::set 是标准模板库(STL)中的一个容器,它是一个有序的关联容器,用于存储不重复的元素。每个元素在 std::set 中都有唯一的键值,而且它们按照升序进行排序。

所以刚才我们提到的比较节点是比较内存地址而非值,所以我们在set中存放的应该是ListNode *

接下来的事情就很简单了,我每次存一个内存地址,如果出现内存地址相同的情况,那就是有环。

2.2 源码

class Solution {
public:bool hasCycle(ListNode *head) {std::set<ListNode*> node_set;while(head){//如果查找head节点对应的内存地址找到相同的了,并且这个地址不是set的最后一个元素,那么就是有环if(node_set.find(head)!=node_set.end()){return true;}node_set.insert(head);head=head->next;}return false;}
};

总结

如何判断链表有环的情况,之前没遇到过。所以第一次做的时候有点懵逼,同时对双指针的使用上并不是特别熟悉,这道题在初期思考的时候都是想着怎么用单链表加标志位的情况来判断。还是有点草率了。

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

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

相关文章

kylin集群负载均衡(kylin3,hbaseRIF问题)

hbase历险记 目录 hbase历险记 寻找问题 分析原因 解决方案 方案1&#xff08;资源问题、失败&#xff09; 方案2&#xff08;成功&#xff09; 寻找问题 不知道你是不是有这样的疑惑。我kylin是个单机&#xff0c;我使用的hbase是个集群&#xff0c;但内存全在某一台机…

【b站咸虾米】chapter4_vue组件_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 四、vue组件 uni-app官网 …

小蓝和小桥的挑战*

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int t sc.nextInt();sc.nextLine();while(t-- > 0) {int n sc.nextInt();sc.nextLine();int[] a new int[n];for(int i0;i<n;i)a[i…

Python 保持登录状态进行接口测试的方法示例

记录三种添加cookie保持接口登录状态的方法&#xff0c;方便自己回顾。 1.简单粗暴式。 此方法比较小白&#xff0c;前提是已经通过fiddler抓包等方式拿到了cookie&#xff0c;然后直接塞进去。 import requeststrainsUrl http://XXX.com/trainsheaders {"Content-Typ…

解决kali beef启动失败解问题

只限于出现这个提示的时候使用 卸载 ruby apt remove ruby 卸载 beef apt remove beef-xss 重新安装ruby apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine 重新安装beef apt-get install beef-xss 弄完以上步骤如果还是不行就重启kali再试…

GaussDB与openGauss有什么相同和不同?

众所周知&#xff0c;GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务&#xff0c;openGauss是开源数据库&#xff0c;两者之间又是什么样的关系&#xff0c;有什么相同和不同&#xff0c;让我…

各种版本对应关系:SpringCloudAlibaba——SpringCloud——SpringBoot——SpringFramework——JDK

SpringCloudAlibaba——SpringCloud——SpringBoot——SpringFramework——JDK 一般情况&#xff0c;在https://github.com/项目/wiki目录下有发布信息及对应的要求其他依赖的版本信息SpringCloudAlibaba——SpringCloud——SpringBootSpringBoot和SpringFramework的版本对应关…

T细胞耗竭如何研究,看看这篇靶向甲基转移酶的癌症顶刊思路 | 国自然热点

T 细胞耗竭&#xff08;T Cell Exhaustion, Tex&#xff09;是指因长期慢性感染或癌症&#xff0c;导致患者体内T细胞功能丧失的情况。由于长期暴露于持续性抗原或慢性炎症&#xff0c;T细胞逐渐失去效应功能&#xff0c;记忆T细胞特征也开始缺失。T细胞耗竭通常与对持续感染和…

Docker(一)简介和基本概念:什么是 Docker?用它会带来什么样的好处?

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&#xff1f; 好吧&#xff0c;让我们带…

基于HFSS的微带线特性阻抗仿真-与基于FDTD的计算电磁学方法对比(Matlab)

基于HFSS的微带线特性阻抗仿真-与基于FDTD的计算电磁学方法对比&#xff08;Matlab&#xff09; 工程下载&#xff1a; HFSS的微带线特性阻抗仿真工程文件&#xff08;注意版本&#xff1a;HFSS2023R2&#xff09;&#xff1a; https://download.csdn.net/download/weixin_445…

ArcGIS Pro SDK 通知框

样式 代码 using ArcGIS.Core.CIM; using ArcGIS.Core.Data; using ArcGIS.Core.Geometry; using ArcGIS.Desktop.Catalog; using ArcGIS.Desktop.Core; using ArcGIS.Desktop.Editing; using ArcGIS.Desktop.Extensions; using ArcGIS.Desktop.Framework; using ArcGIS.Deskt…

[排序篇] 快速排序

目录 前言 一、概念 二、快速排序算法 三、快速排序算法代码 四、快速排序之递归函数讲解 五、补充说明 总结 往期回顾 [排序篇] 冒泡排序[排序篇] 冒泡排序-CSDN博客 前言 上一节我们学习了冒泡排序&#xff0c;但是它的执行效率很低&#xff0c;时间复杂度…