当前位置: 首页 > article >正文

算法7(力扣141)-循环链表

1、问题

         给你一个链表的头节点 head ,判断链表中是否有环。

        如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递

        仅仅是为了标识链表的实际情况。

        如果链表中存在环 ,则返回 true 。 否则,返回 false

2、采用例子

        输入:head = [3,2,0,-4], pos = 1

        输出:true

        解释:链表中有一个环,其尾部连接到第二个节点。

3、实现思路

        先创建循环链表

4、具体步骤

(1)定义链表结构(因为此次需要使用数组创建链表,所以定义链表结构需要给next一个默认值null)

        

(2)创建循环链表

实现思路:找到开始循环的节点,将链表循环的最后一位指向开始循环的节点

       

        1)通过传递数组长度是否为空,判断链表是否为空链表,空链表直接返回

        

        2)定义链表头结点、当前节点和开始循环的节点
        
        3)通过循环遍历赋值,同时寻找开始循环的节点(给的有开始循环的位置pos)
        
        4)循环结束后,让链表的最后一个循环点指向开始循环的点
        5)打印并返回链表
        

(3)检查是否有循环

        通过快慢指针,当快指针追上慢指针时,即存在循环

        1)判断是否是空链表,空链表返回
        
        2)进入函数,定义快慢指针,判断是否有循环,存在返回true
        
        3)函数结束,无循环返回false
        

5、完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>环形链表</title>
</head>
<body>
    <p>
        给你一个链表的头节点 head ,判断链表中是否有环。
        如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递
        。仅仅是为了标识链表的实际情况。
        如果链表中存在环 ,则返回 true 。 否则,返回 false
    </p>
    <p>
        输入:head = [3,2,0,-4], pos = 1
        输出:true
        解释:链表中有一个环,其尾部连接到第二个节点。
    </p>
    <script>
        class ListNode{
            constructor(val,next=null){
                this.val = val
                this.next = next
            }
        }
        let arr = [3, 2, 0, -4]
        let pos = 1
        let head = cycleList(arr,pos)
        hasCycle(head)
        // 怎么创建一个环形链表
        function cycleList(arr,cycleStartIndex){
            // 空数组,即链表为空
            if (arr.length===0) {
                return null
            }
            // 头结点
            let head = new ListNode(arr[0])
            // 当前节点
            let cur = head
            // 开始循环的节点
            let cycleNode = null
            for (let i = 1; i < arr.length; i++) {
                // 利用数组的值创建节点,赋值给当前节点
                cur.next = new ListNode(arr[i])
                // 指针后移
                cur = cur.next
                // 判断循环点,是循环点,将当前节点赋值给循环点作为标记,方便后续构建闭环
                if(i === cycleStartIndex){
                    cycleNode = cur
                }
            }
            // 让循环结束时当前节点的下一位指向循环点,构成闭环
            cur.next = cycleNode
            console.log(head);
            
            // 返回链表
            return head
        }
        function hasCycle(head){
            // 空链表
            if (!head)return false;
            // 使用快慢指针,当快指针和慢指针指向同一节点时存在环
            let slow = head
            let fast = head
            while(fast&&fast.next){
                fast = fast.next.next
                slow = slow.next
                if(fast == slow){
                    console.log(true);
                    
                    return true
                }
            }
            console.log(false);
            
            return false
        }

    </script>
</body>
</html>

6、力扣通过代码

var hasCycle = function(head) {
      // 空链表
            if (!head)return false;
            // 使用快慢指针,当快指针和慢指针指向同一节点时存在环
            let slow = head
            let fast = head
            while(fast&&fast.next){
                fast = fast.next.next
                slow = slow.next
                if(fast == slow){
                    console.log(true);
                    
                    return true
                }
            }
            console.log(false);
            
            return false
};


http://www.kler.cn/a/515230.html

相关文章:

  • 微前端qiankun的基本使用(vue-element-admin作为项目模版)
  • SSM开发(二) MyBatis简介
  • IOS 安全机制拦截 window.open
  • 顺序表和链表(详解)
  • 深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
  • (二叉树)
  • 固件测试工具选型需要考察的功能点汇总
  • springboot设置多环境配置文件
  • 【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾
  • 【Python】面对对象超全总结:封装,继承,多态
  • 修改word的作者 最后一次保存者 总编辑时间 创建时间 最后一次保存的日期
  • 白玉微瑕:闲谈 SwiftUI 过渡(Transition)动画的“口是心非”(下)
  • 无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整
  • 使用EVE-NG-锐捷实现静态路由
  • jvm_threads_live_threads 和 jvm_threads_states_threads 这两个指标之间存在一定的关系,但它们关注的维度不同
  • 【Go面试】工作经验篇 (持续整合)
  • 通俗的讲,网络爬虫到底是什么?
  • HQChart使用教程30-K线图如何对接第3方数据45- DRAWRADAR数据结构
  • jvm G1 垃圾收集日志分析示例(GC)
  • ubuntu终端当一段时间内没有程序运行时,自动关闭终端。
  • Golang笔记—— error 和 panic
  • 在 Ubuntu 22.04 上安装 Kubernetes(Kubeadm 安装方式)
  • STM32 ST7735 128*160
  • 数据链路层协议
  • FluentCMS:基于 ASP.NET Core 和 Blazor 技术构建的开源CMS内容管理系统
  • 代码随想录——串