环形链表的相关问题

本文详细介绍了环形链表的概念,探讨了如何使用快慢指针判断环形链表的存在,以及如何找到环形链表的第一个节点。通过追击问题的分析,证明了从头节点到环的第一个节点的距离等于从相遇点到环的第一个节点的距离。
摘要由CSDN通过智能技术生成

什么是环形链表

答:环形链表是一种特殊类型的链表数据结构,其最后一个节点的"下一个"指针指向链表中的某个节点,形成一个闭环。

形式多为:为一种闭环模式

1.环形链表的判断

代码:该代码使用了快慢指针,如果slow==fast,则存在环形链表,反之则不存在

slow一次走一步,fast一次走多步

bool hasCycle(struct ListNode *head) {
    //找到相遇点
    struct ListNode*slow = head;
    struct ListNode*fast = head;
    struct ListNode*meet = NULL;
    while(fast&&fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

其中会涉及到追击问题

1.当slow走1步,fast走2 3 4 5 。。。。是否一定会追上?

答案是一定可以追上

解析如下

2.环形链表第一个节点的查找

代码:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode*slow = head;
    struct ListNode*fast = head;
    struct ListNode*meet = NULL;//相遇指针
    struct ListNode*newhead = head;//新头指针
    while(fast&&fast->next)
    {
        //找到相遇结点,赋值给meet
        slow = slow->next;
        fast = fast->next->next;
        if(slow==fast)
        {
            meet = slow;
            //meet和newhead一起走,相遇点为环的第一个节点,下面主要为证明此事
            while(newhead!=meet)
            {
                meet = meet->next;
                newhead = newhead->next;
            }
            return newhead;
        }
    }
    return NULL;
}

图示:

设环的第一个节点距离相遇点距离为:N

从头节点到环的第一个节点为:L

环的周长为:C

从相遇点到第一个节点距离为:C-N

证明:

到此证明完毕:从头结点到环的第一个节点的距离==从相遇点到环的第一个节点的距离 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值