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

判断链表是否有环

时间:2024-07-28 22:07:50浏览次数:5  
标签:slow ListNode fast next 链表 判断 有环 null

题目要求

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

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

不允许修改 链表。

思路实现

我们定义两个指针吗,分别是slow,fast.slow指针每次向前移动一个节点,fast指针每次向前移动两个节点,这里我们画个图会比较好理解一些,通过列出公式我们可以得出如果从两个指针相遇的位置到链表第一次入环的位置,nam这里的距离z==x,我们就可以得出我们第一次入环的节点了,这题比较考验自己的逻辑推理能力

代码实现

全面些的代码

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        } else {
            ListNode slow = head;
            ListNode fast = head;
            ListNode first = head;
            // int count=0;
            ListNode xiangyu = new ListNode(0);
            while (fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                // count++;
                if (slow == fast) {
                    xiangyu = slow;
                    break;
                }
            }
            if (slow != fast || (slow == fast && slow.next == null) || (slow == fast && slow.next.next == null)) {
                return null;
            }
            while (first != xiangyu) {
                first = first.next;
                xiangyu = xiangyu.next;
            }
            return first;
        }
    }
}

简化后的代码(第一次看的话可能不是很好理解)

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {// 有环
                ListNode index1 = fast;
                ListNode index2 = head;
                // 两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while (index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

标签:slow,ListNode,fast,next,链表,判断,有环,null
From: https://www.cnblogs.com/dfj-blog/p/18328940

相关文章

  • 可逆矩阵的概念、定理、判断条件和性质(线性代数基础)
    可逆矩阵的概念、定理、判断条件和性质可逆矩阵的概念定义:设AAA为n......
  • Python科研武器库 - 文件/路径操作 - 判断路径是否存在
    使用场景:在科研中,用Python处理数据的一个核心目的是批量处理,批量处理节省了研究者大量的时间和精力,不然,还不如手动一个个地去处理。批量处理通常要求数据整体较为规整,能够进行统一的处理操作,但实际数据中总存在一些不规则的样本,甚至有些样本的命名都存在不规范,例如,整个数据集......
  • 判断推理——逻辑判断
    前言 今天设了一个公考的专栏,以后会不定时更新自己的学习整理。作为一个工科考公的学生,我想利用工科的知识思维去理解公考当中偏理的部分,感兴趣的uu可以一起交流想法,互相督促思考,当然有不对的地方也希望大家及时指正哈~必然性推理首先是判断推理中的逻辑判断部分,我把复言......
  • 四向链表实现
    参加某公司面试,要求15分钟内完成一个N维的四向链表,要求上下左右值准确,如图:代码实现: 四向链表节点类 FourLinkedNodeimportlombok.Data;importlombok.NoArgsConstructor;/***四向链表节点类*@param<T>*/@Data@NoArgsConstructorpublicclassFourLinkedN......
  • 关于链表、顺序表、栈和队列的一些总结
    关于链表、顺序表、栈和堆的一些总结1.顺序表2.链表2.1单向链表2.1带哨兵位双向循环链表3.栈4.队列1.顺序表2.链表2.1单向链表2.1带哨兵位双向循环链表3.栈4.队列......
  • 1.线性结构(上)——数组与链表
    线性结构(上):数组和链表1.数据结构基本分类线性结构:表、栈、队列非线性结构:树、图、集合本节,我们主要围绕线性表展开讨论线性表主要有两类存储方式:即顺序存储方式——顺序表(数组);链表存储方式——链表在探讨线性表时,我们主要把目光聚焦在“增、删、查”这三种操作之上,同时我们......
  • golang 数组转为链表 - 正序和逆序
    有时候,有这样的场景,我们需要就给定数组将其转为一个链表,通常的思路有两种:正序逆序以下是具体的代码实现和测试函数:packagemainimport("fmt""testing")typelistNodestruct{next*listNodevalint}//正序遍历构建链表//通过一个虚拟头结点,不......
  • fastjson反序列化漏洞原理及<=1.2.24&<=1.2.47&Fastjson v1.2.80简单利用&不出网判断&修
    1、什么是fastjsonfastjson是一个有阿里开发的一个开源Java类库,可以将Java对象转换为JSON格式(序列化),当然它也可以将JSON字符串转换为Java对象(反序列化)。2、漏洞原理FastJson在解析json的过程中,⽀持使⽤autoType来实例化某⼀个具体的类,并调⽤该类的set/get⽅法......
  • 怎么判断电脑屏幕被监控?电脑被监控可以看到什么?丨2024超强科普!
    各位同仁,是不是正在怀疑自己的电脑被监控了?那么又该怎么盘点自己的电脑是不是正在被监控,假如真的被监控,老板又会看到什么内容呢?别急,且听我慢慢道来!一、电脑被监控的表现黑屏闪烁当电脑被监控时,屏幕可能会出现短暂的黑屏或频繁闪烁。这种情况多出现在电脑启动或打开特定程......
  • 手撕数据结构---------顺序表和链表
    1.线性表线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常......