力扣876:链表的中间结点
题目描述:
 给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
 
输入:head = [1,2,3,4,5]
 输出:[3,4,5]
 解释:链表只有一个中间结点,值为 3 。
 示例 2:
 
输入:head = [1,2,3,4,5,6]
 输出:[4,5,6]
 解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
提示:
链表的结点数范围是 [1, 100]
 1 <= Node.val <= 100
分析:
 快慢指针思想
定义两个指针,快指针fast,慢指针slow,从头开始遍历:
fast一次走两步,慢指针一次走两步
遍历结束后,慢指针所在的节点就是中间节点,返回slow即可
那么什么时候遍历结束呢?
链表为奇数个时:

 
 
 fast->next为空时,遍历结束。
链表为偶数个时:

 

 fast为空时,遍历结束。
 
代码:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode*fast=head,*slow=head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
    }
    return slow;
}



















![P1547 [USACO05MAR] Out of Hay S 题解](https://img-blog.csdnimg.cn/f95ddae62a4e43a68295601c723f92fb.gif#pic_center)