LeetCode-Easy部分标签为LinkedList 141 Linked List Cycle

本文介绍使用快慢指针法检测单链表是否存在环,并进一步解析如何确定环的长度、连接点及整个链表的长度。通过具体的代码实现与算法步骤说明,帮助读者深入理解这一经典数据结构问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

Given a linked list, determine if it has a cycle in it.

题目分析

判断单链表中是否有环路。
关于单链表中是否有环的概念,请大家自行查询。我由于未找到权威定义,暂时不放到这里。

代码实现

       public bool HasCycle(ListNode head)
        {
            if (head == null) return false;
            if (head.next == null) return false;
            if (head.next.next == null) return false;

            ListNode slow = head;
            ListNode fast = head;

            while (fast != null && fast.next != null)
            {
                slow = slow.next;
                fast = fast.next.next;
                if (fast == null)
                    return false; //快指针如果为null,不存在环
                if (fast.val == slow.val)
                {
                    return true; //找到节点数据域相等点,存在环
                }
            }
            return false;
        }

附引用参考网址:
http://www.cnblogs.com/xudong-bupt/p/3667729.html

求有环单链表中的环长、环起点、链表长

  1. 判断单链表是否有环

      使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。

      就是所谓的追击相遇问题:

        这里写图片描述

  2. 求有环单链表的环长

      在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。

      设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*len步,相遇时多走了一圈:

        环长=2*len-len。

  3. 求有环单链表的环连接点位置

      第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。

        这里写图片描述

      在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为LenA,连接点到第一次相遇点的长度为x,环长为R。

        第一次相遇时,slow走的长度 S = LenA + x;

        第一次相遇时,fast走的长度 2S = LenA + n*R + x;

        所以可以知道,LenA + x = n*R;  LenA = n*R -x;

  4. 求有环单链表的链表长

      上述2中求出了环的长度;3中求出了连接点的位置,就可以求出头结点到连接点的长度。两者相加就是链表的长度。


这里写图片描述
  

LinkedList 更多题目

Easy部分标签为LinkedList 的所有题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值