首页 > 其他分享 >如何判断链表是否有环?

如何判断链表是否有环?

时间:2024-12-16 09:23:05浏览次数:7  
标签:判断 fast next 链表 有环 节点 指针

在前端开发中,虽然链表不是最常用的数据结构,但在处理某些问题时,它仍然是一个有用的工具。判断链表是否有环是一个常见的链表相关问题。以下是一个简单而有效的方法来判断链表是否有环:

使用快慢指针(Floyd's Cycle-Finding Algorithm)

  1. 初始化两个指针,一个快指针(每次移动两个节点)和一个慢指针(每次移动一个节点),都指向链表的头节点。
  2. 开始遍历链表,快指针每次移动两个节点,慢指针每次移动一个节点。
  3. 如果链表中存在环,那么快指针和慢指针最终会在环内的某个节点相遇。这是因为快指针会更快地进入环并开始循环,而慢指针稍后也会进入环并开始循环。由于快指针的速度是慢指针的两倍,所以它们最终会在环内相遇。
  4. 如果链表中不存在环,那么快指针会先到达链表的末尾(即指向null)。在这种情况下,我们可以确定链表没有环。

以下是一个简单的JavaScript实现:

function hasCycle(head) {
    if (head === null || head.next === null) {
        return false;
    }
    
    let slow = head;
    let fast = head.next;
    
    while (slow !== fast) {
        if (fast === null || fast.next === null) {
            return false;
        }
        slow = slow.next;
        fast = fast.next.next;
    }
    
    return true;
}

这个函数接受一个链表的头节点作为参数,并返回一个布尔值来表示链表是否有环。注意,这个实现假设链表中的节点至少有两个(即头节点和它的下一个节点)。如果链表为空或只有一个节点,那么它显然不可能有环,所以函数直接返回false。

标签:判断,fast,next,链表,有环,节点,指针
From: https://www.cnblogs.com/ai888/p/18609190

相关文章

  • 【C++】- 掌握STL List类:带你探索双向链表的魅力
    文章目录前言:一.list的介绍及使用1.list的介绍2.list的使用2.1list的构造2.2listiterator的使用2.3listcapacity2.4listelementaccess2.5listmodifiers2.6list的迭代器失效二.list的模拟实现1.list的节点2.list的成员变量3.list迭代器相关问题3.1普通迭......
  • leetcode K个一组翻转链表
    1、题目链接25.K个一组翻转链表-力扣(LeetCode)2、题目描述3、题目分析a.每次根据输入的开始节点,得出k个节点之后的结束节点,即分组,然后返回该结束节点。注意有可能不够k个节点,就会返回null。publicListNodegetKGroupEnd(ListNodestart,intk){while(--k!=0&......
  • 【力扣算法】234.回文链表
    快慢指针:一个指针走两步,一个指针走一步,当快指针走到链表末尾时,慢指针走到中间位置。 逆转链表:根据指针位置分成两个表,逆转第二个表。按序判断就可以,如果是相同就是回文,反之就不是。快慢指针能找链表中间,也可以判断链表是否有环/***Definitionforsingly-linkedlist.......
  • ChatGPT脚本: 全自动部署jdk环境(自动判断系统架构部署)
    脚本地址https://dlk2qiw7lh.feishu.cn/docx/CxphdYsBrocrZmxSV0kca7dBnwg?from=from_copylink脚本内容:#!/bin/bash#设置erase字符以正确处理退格键sttyerase^H2>/dev/null||sttyerase^?#定义颜色和样式BOLD=$(tputbold)NORMAL=$(tputsgr0)RED='\033[0;3......
  • Swift 实现:寻找单链表相交节点
    文章目录摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结摘要本篇文章将分享如何通过Swift编写程序,找到两个单链表相交的起始节点。我们将分析问题,提供清晰的题解代码,并通过示例测试验证结果。同时,文章会详细剖析代码逻辑,评估其时间复杂度......
  • #. 判断元素是否存在传统题1000ms256MiB
    题目描述有一个集合M是这样生成的:(1)已知k是集合M的元素;(2)如果y是M的元素,那么,2y+1和3y+1都是M的元素;(3)除了上述二种情况外,没有别的数能够成为M的一个元素。问题:任意给定kk和xx,请判断xx是否是MM的元素。这里的kk是无符号整数,xx 不大于 100000100000,如果是,则输出YES,否......
  • 链表操作2
    [Algo]链表操作21.两个链表的交点ListNode*intersectionNode(ListNode*head1,ListNode*head2){if(head1==nullptr||head2==nullptr)returnnullptr;ListNode*cur1=head1,*cur2=head2;intlen1=1,len2=1;while(cur1->next!=nul......
  • 【计组不挂科】计算机组成第六章< 总线 >习题库(选择题&判断题&填空题&填空计算题)(含答案与解
    前言大家好吖,欢迎来到YY滴计算机组成系列,热烈欢迎!本章主要内容面向接触过C++的老铁本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考本章为分章节的习题内容题库,试卷与大题库可以看下面传送门其他博客【计组不挂科】计算机......
  • 算法网关视频分析网关视频接入热知识:ONVIF协议如此重要,如何判断摄像头是否支持呢?
    在构建一个高效、可靠的监控系统时,选择合适的设备至关重要。选择监控系统设备时,我们不仅要关注设备的性能和价格,还要考虑设备的兼容性和未来的扩展性。为了确保系统的稳定运行和方便未来的维护升级,选择同一品牌的摄像头和录像机是一个理想的选择。然而,在某些特殊情况下,我们可能需......
  • 链表-查找结点
     链表好难啊!理解了尾差法但是却无法写出完整代码.题目描述设计函数int  locate(structnode*head,charx);,找到以head为头指针的链表中,数据域的值等于x的结点,并返回该结点的序号(即是第几个结点)。输入一行包含#的字符串,将以#前的每个字符为数据域的值创建多个结点......