链表的中间节点(C语言 -> 快慢指针)

题目介绍

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

// Definition for singly-linked list.
 struct ListNode 
 {
     int val;
     struct ListNode *next;
 };

题目链接:
leetcode
牛客网

示例一

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例二:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

思路介绍

思路一-遍历链表

没做过这道题的人最先想到的一定是:先遍历整个链表,算出元素个数,在从头开始寻找中间节点

  1. 计算元素个数
  2. 找到中间节点
struct ListNode* middleNode(struct ListNode* head) 
{
    //防止传入空指针
    if (head == NULL)
    {
        return NULL;
    }

    //计算链表元素个数
    int count = 0;
    struct ListNode* tail = head;
    while (tail != NULL)
    {
        count++;
        tail = tail->next;
    }

    //找到中间节点
    tail = head;
    count = count / 2;
    for (int i = 0; i < count; i++)
    {
        tail = tail->next;
    }

    return tail;
}

思路二-快慢指针

快慢指针的思路十分经典,使用与很多题目
简单来说,就是定义两个指针,快指针fast和慢指针slowfast一次走两步,slow一次走一步,fastslow同时在head出开始走,直到fast走到最后一个节点(链表有奇数个节点)或空指针(链表有偶数个节点)
1. 先来看奇数个节点(这是动图):
奇数个元素
可以得到,当链表元素个数为奇数个节点时,结束条件为fast->next == NULL,此时,中间节点就是slow

2. 再来看偶数个节点(这是动图):
偶数个元素
可以得到,当链表元素个数为偶数个节点时,结束条件为fast == NULL,此时,中间节点就是slow

struct ListNode* middleNode(struct ListNode* head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;

    while (fast != NULL && fast->next != NULL)
    {
        fast = fast->next->next;
        slow = slow->next;
    }    

    return slow;
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 19:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 19:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 19:24:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 19:24:02       20 阅读

热门阅读

  1. KAN网络

    KAN网络

    2024-05-13 19:24:02      11 阅读
  2. 微调大模型学习记录

    2024-05-13 19:24:02       15 阅读
  3. MFC--CCreateContext结构体

    2024-05-13 19:24:02       9 阅读
  4. 三种基本排序-冒泡,选择,二分

    2024-05-13 19:24:02       10 阅读
  5. MySQL中所有数据类型

    2024-05-13 19:24:02       9 阅读
  6. MongoDB聚合运算符:$topN

    2024-05-13 19:24:02       11 阅读
  7. stylus详解与引入

    2024-05-13 19:24:02       13 阅读
  8. 深度学习学习日记(5.6)

    2024-05-13 19:24:02       11 阅读
  9. 初级银行从业资格证知识点(十)

    2024-05-13 19:24:02       11 阅读
  10. 升级WSL Ubuntu内核从5.10到5.15

    2024-05-13 19:24:02       17 阅读
  11. Flink面试整理-Flink的配置管理包含哪些?

    2024-05-13 19:24:02       14 阅读
  12. Python Pandas 数据分析快速入门

    2024-05-13 19:24:02       12 阅读
  13. el-tree

    2024-05-13 19:24:02       24 阅读
  14. QT 文字转语言插件

    2024-05-13 19:24:02       15 阅读