力扣876:链表的中间结点

力扣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即可

那么什么时候遍历结束呢?

链表为奇数个时:

力扣876:链表的中间结点_第1张图片
力扣876:链表的中间结点_第2张图片
力扣876:链表的中间结点_第3张图片
fast->next为空时,遍历结束。

链表为偶数个时:

力扣876:链表的中间结点_第4张图片
力扣876:链表的中间结点_第5张图片

力扣876:链表的中间结点_第6张图片
fast为空时,遍历结束。
力扣876:链表的中间结点_第7张图片

代码:

/**
 * 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;
}

你可能感兴趣的:(leetcode,链表,算法,c语言,学习,数据结构)