题目表述
给你单链表的头结点 head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

这道题的思路是快慢指针,具体来说就是定义两个指针,一快一慢,快指针一次走两步,慢指针一次走一步,当快指针走到末尾时,慢指针所指向的结点即为中间结点。具体来说,还要细分为两种情况,一种情况是有奇数个结点,另一种情况是有偶数个结点,请看图:
奇数个结点:

偶数个结点:

因此,综合以上两种情况,当fast指向结点的val==NULL或者fast==NULL时,这时的slow即为所求中间结点。
完整代码如下:
struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast && fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
    }
    return slow;
} 
                

![[AUTOSAR][诊断管理][ECU][$3E] 测试设备在线|会话保持](https://img-blog.csdnimg.cn/b44b336b3f624d36a49ad1deb4617d2a.png)















