每日一题(链表的中间节点)

每日一题(链表的中间节点)

876. 链表的中间结点 - 力扣(LeetCode)
每日一题(链表的中间节点)_第1张图片

思路:

如下图:可以定义两个结构体指针均从链表的头节点开始向后遍历,fast指针一次走两步,slow指针一次走一步,fast指针的速度永远是slow指针速度的两倍。根据链表的个数的奇偶性可以将情况分为两种:

每日一题(链表的中间节点)_第2张图片

情况一:当链表的个数为奇数个时(如下图),直到fast走到尾节点时,此时slow节点就是链表的中间节点。

每日一题(链表的中间节点)_第3张图片

情况二:当链表的个数为偶数个时(如下图),直到fast为空指针时,此时的slow节点就是链表的中间节点。

每日一题(链表的中间节点)_第4张图片

注意:

  1. 只要链表的个数是奇数个,那么fast一定会走到尾节点,不会走到空指针处。
  2. 只要链表的个数是偶数个,那么fast一定会走到空指针处,不会走到尾节点。

由于我们无法知晓链表个数的奇偶性,所以当fast只要走到了尾节点或空指针处,此时的slow一定就是链表的中间节点。

代码实现:

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

完结

链表的中间节点题目的分析就到这里啦,若有不足,欢迎评论区指正,下期见!

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