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

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

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


876. 链表的中间结点 - 力扣(LeetCode)


b04a2f2dbb44f2b11e8cb476cda2310f_8f8a48f27aa24392847ccd75756284cf.png


思路:


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


af9995728d84e88da1affd3a2591d34a_a4fbeb3f5d1449bba75742c98a656e01.png


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


image.png


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


8608a1b75f92f49e4228aedbc87c3f11_f258d8288b2e4d4b8bbdad18b61b3cd9.png


注意:


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


完结


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


相关文章
|
18天前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
18 0
|
2天前
|
存储 Python
链表中插入节点
链表中插入节点
|
2天前
|
存储 Python
删除链表节点详解
删除链表节点详解
|
2天前
|
存储 Python
链表中删除节点
链表中删除节点
|
4天前
|
存储 C语言
C语言中处理动态数据类型链表节点冲突的技术探讨
C语言中处理动态数据类型链表节点冲突的技术探讨
12 0
|
6天前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
14 1
|
6天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
12 0
|
6天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
18 0
|
10天前
24. 两两交换链表中的节点
24. 两两交换链表中的节点
26 6
|
10天前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析