数据结构之单链表之环形链表

1.题目

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

2.分析

首先,我们应该判断链表是否有环,这个可以根据我的上一篇文章的快慢指针来判断。

c 复制代码
bool hasCycle(struct ListNode* head) {
    struct ListNode* slow = head;//慢指针
    struct ListNode* fast = head;//快指针
    while (fast && fast->next) {
       slow = slow->next;//慢指针走一步
        fast = fast->next->next;//快指针走两步
        if (slow == fast) {
            return true;//两个指针相遇则有环
        }               //证明过程可以看上一篇博客
        
    }
    return false;
}

其次,我们如何寻找入环的第一个节点呢?

这里有一个理论,我们先使用,稍后做证明。
理论:头节点到入环的第一个节点的距离等于快慢指针相遇时的位置到入环的第一个节点的距离

复制代码

证明

所以,题目的完整答案

c 复制代码
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode*slow = head;
    struct ListNode*fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)//找到快慢指针的相遇点
        {
            struct ListNode*meet = slow;
            struct ListNode*cur = head;
            while(cur)
            {
                
                if(meet==cur)
                return meet;
                meet = meet->next;//走向环的第一个节
                cur = cur->next;//走向环的第一个节点
            }
        }
    }
    return NULL;
}

如果发现有什么不对的地方,或者不理解的地方,可以评论我哟!

相关推荐
zwenqiyu9 分钟前
非线性字符串数据结构串讲
数据结构·c++·学习·算法
东华万里1 小时前
第32篇 数据结构入门 单链表的增删查改实现
数据结构·链表
文祐1 小时前
C语言用双向链表实现单调递减(递增)队列
c语言·开发语言·链表
OOJO3 小时前
哈希表实现
数据结构·哈希算法·散列表
剑挑星河月6 小时前
234. 回文链表
java·数据结构·算法·leetcode·链表
六bring个六6 小时前
链表学习(常规链表)
数据结构·学习·链表
tachibana21 天前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
aaaameliaaa1 天前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
-dzk-1 天前
【系统架构设计师】案例分析篇
开发语言·数据结构·python·算法·架构·系统架构·架构设计
东华万里1 天前
第30篇 代码习惯 初学C与数据结构有感
c语言·数据结构·大学生专区