[LeetCode]链表的中间结点

在这里插入图片描述

[LeetCode]链表的中间结点


题目

给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

在这里插入图片描述

链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/description/


分析

在这里我们讲解一种在链表中最常用也是十分经典的解决办法————快慢指针

在这里插入图片描述
我们先举出我们在高中学过的例子,追击相遇的题目,自行车的速度是4m/s,电动车的速度是8m/s,两辆车同时从桥的起点出发,问:当电动车通过桥的终点时,自行车处在什么位置?

相信大家都快脱口而出,当电动车通过桥的终点时,自行出处于桥的中间位置

那么这种思想在计算机中也同样可以使用,面对这道题目,当我们想要寻找到当前链表的中间结点时,我们可以创建两个指针,一个指针的每一次移动的速度是另一个指针的移动速度的两倍,那么当我们的快指针先遍历链表结束时,慢指针正好移动到快指针的路程的一半,也就是链表的中间结点。

那么我们解决这道题的思路就是,我们创建两个指针,slow、fast;slow指针每一次移动一个单位距离slow = slow->next;fast指针每一次移动两个单位距离fast = fast->next->next 但我们要注意我们在遍历链表时的限制条件,因为当 我们在遍历时可能fast->next就已经指向NULL,所以我们要注意我们的遍历限制条件。


代码

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* slow = head;
    struct ListNode* fast = head;

    while(fast && fast->next)//判断条件尤其注意,既要保证我们fast还要保证fast->next不为NULL。这里我们不写fast->next->next是因为当我们的fast->next == NULL,fast->next->next必定为NULL
    {
        fast = fast->next->next;
        slow = slow->next;
    }

    return slow;
}

总结

快慢指针在我们数据结构中的链表问题经常使用,也是十分经典的解决方法,在后面的问题中会经常使用,在后面我也会继续分析与记录

以上就是我对这种方法的个人理解

上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】
在这里插入图片描述

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr、Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值