首页 > 编程语言 >【算法】【线性表】【链表】环形链表

【算法】【线性表】【链表】环形链表

时间:2024-01-16 09:03:03浏览次数:39  
标签:head ListNode 线性表 next 链表 算法 quickNode 指针

1  题目

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

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

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

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引 。

进阶:你能用 O(1)(即,常量)内存解决此问题吗?

2  解答

/**
 * Definition for singly-linked list.
 * class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) {
 * val = x;
 * next = null;
 * }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        // 参数边界校验
        if (head == null) {
            return false;
        }
        // 因为就一条路,拿 set来记录
        // 记录当前遍历的节点
        Set<ListNode> sets = new HashSet<>();
        ListNode node = head;
        while (node != null) {
            // 如果存在说明有环,直接返回 true
            if (sets.contains(node)) {
                return true;
            }
            sets.add(node);
            node = node.next;
        }
        // 没发现环,返回false
        return false;
    }
}

看了部分题解,发现另一种思路,就是用快慢指针,也就是两个指针,慢指针每次走一步,快指针每次走两下,如果有环的话,快指针肯定会和慢指针相遇,没有的话,快指针就到重点了。

/**
 * Definition for singly-linked list.
 * class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) {
 * val = x;
 * next = null;
 * }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        // 参数边界校验
        if (head == null) {
            return false;
        }
        // 快指针(不一定要移动两位,移动三位,四位...都行,只要比慢的快)
        ListNode quickNode = head;
        // 慢指针
        ListNode slowNode = head;
        // 快指针没结束
        while (quickNode != null) {
            // 快指针移动一位
            quickNode = quickNode.next;
            if (Objects.isNull(quickNode)) break;
            // 快指针再移动一位
            quickNode = quickNode.next;
            if (Objects.isNull(quickNode)) break;
            // 快指针再移动一位
            // quickNode = quickNode.next;
            // if (Objects.isNull(quickNode)) break;
            // 慢指针移动一位,前边快的已经校验空了,慢的不会空指针,所以这里不需要校验
            slowNode = slowNode.next;
            // 两者相遇说明有环,快的绕了一圈都把慢的追上了
            if (quickNode == slowNode) {
                return true;
            }
        }
        return false;
    }
}

加油。

标签:head,ListNode,线性表,next,链表,算法,quickNode,指针
From: https://www.cnblogs.com/kukuxjx/p/17966758

相关文章

  • 人工智能选股框架及经典算法简介
    人工智能和机器学习并不神秘人工智能和机器学习方法并不神秘,其本质是以数理模型为核心工具,结合控制论、认知心理学等其它学科的研究成果,最终由计算机系统模拟人类的感知、推理、学习、决策等功能。理解常用的机器学习算法,有助于澄清对人工智能的种种误解和偏见,帮助我们更清晰地认......
  • 算法模板 v1.1.1
    算法模板编译CF模板#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*====================*/voidSolve(void){}/*====================*/intmain(){#ifn......
  • R语言关联规则模型(Apriori算法)挖掘杂货店的交易数据与交互可视化
    原文链接:http://tecdat.cn/?p=22732 原文出处:拓端数据部落公众号 关联规则挖掘是一种无监督的学习方法,从交易数据中挖掘规则。它有助于找出数据集中的关系和一起出现的项目。在这篇文章中,我将解释如何在R中提取关联规则。关联规则模型适用于交易数据。交易数据的一个例子可以......
  • 【算法】莫比乌斯反演
    参考博客OI-Wiki|Biuld-数学|Million-组合计数学习笔记|狄利克雷卷积和莫比乌斯反演|算法学习笔记(35):狄利克雷卷积狄利克雷卷积莫反的前置知识,主要引入了一个新运算。常用积性函数单位函数\(\varepsilon(n)=\begin{cases}1&n=1\\0&\text{otherwise}\end{cases}......
  • 吴师兄学算法day07 双指针 680. 验证回文串 II
    题目:680. 验证回文串II易错点:s[1:3]是左闭右开我的第一次代码:classSolution(object):defvalidPalindrome(self,s):""":types:str:rtype:bool"""isPalindrome=lambdax:x==x[::-1]l......
  • 算法练习 1.寻找中心下标(Find the Middle Index in Array)
    算法练习1.寻找中心下表(FindtheMiddleIndexinArray)题目来源来源:力扣(LeetCode)https://leetcode-cn.com/problems/find-the-middle-index-in-array/题目描述给你一个整数数组nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有......
  • Snowflake算法生成Id
    网上大部分C#写的都有点乱糟糟,我简化了一下:usingSystem;namespacexxx{///<summary>///Id生成类///</summary>classSnowflake{privateconststringLOCK_OBJ="76003AEB-E3F9-460A-BD31-D9AE9E7684C0";privatecon......
  • 聚类算法学习总结
    1.1聚类的定义聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。1.2聚类和分类的区别......
  • leetcode 19.删除链表的倒数第N个节点
    leetcode19.删除链表的倒数第N个节点第十九题:删除链表的倒数第N个节点在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummynode),它的next指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。例如,在本题中,如果我们要删除节点y,我们需要知道节点y的前......
  • 图像算法(掩膜)
    在图像处理中,掩膜(Mask)是一个用于指定图像中感兴趣区域的二进制图像或矩阵。掩膜通常用于选择、过滤或操作图像的特定区域。掩膜通常表示为一个二进制图像,其中白色像素表示感兴趣的区域,而黑色像素表示不感兴趣的区域。在计算机科学中,掩膜(mask)通常是一个二进制模式,用于对另一个数......