力扣876. 链表的中间结点

题目

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

题解

设置快慢指针slow和fast,slow每次走一步,fast每次走两步,当fast走完时,slow刚好指到链表中间结点。从下图中可以看出,当链表结点个数为奇数时,fast指向链表尾结点,slow刚好指向中间节点;当链表结点个数为偶数时,fast指向NULL,slow刚好指向第二个中间结点。所以循环的条件为 while(fast && fast->next),最后返回slow即可。

 代码如下:

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

猜你喜欢

转载自blog.csdn.net/minLi_/article/details/131665321