【Java】链表的中间结点

简介: 【Java】链表的中间结点

题目入口📌:链表的中间结点

问题描述

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

输入输出实例:

解题分析

       这道题我们需要找到单向链表的中间结点,普通做法我们可以先遍历一次链表,得到链表的长度,然后在寻找中间结点。

    但是如果作为面试题的话,我们就需要再上升一高度,在只遍历一次就找到中间结点。

如何在一次遍历中就找到中间结点呢?我们可以运用 路程 = 速度 x  时间 的思想,如下图,

,那么在相同时间内,黄车跑的路程 肯定是 绿车跑路程的2倍。

所以我们也可以设置两个指针在链表中,一个跑的快一个跑的慢,当快的跑到终点时,慢的恰好在中间位置,这种思路通常叫做快慢指针思想。

     现在我们知道具体该怎么操作之后,就需要确定什么条件下 快指针 停下,慢指针 正好指正中间结点。而链表中的结点个数分为偶数个和奇数个,所以我们的判断条件肯不止一个,这两种情况需要具体分析。


我们先来看奇数个结点,如下图,快指针(fast)一次走两步,而慢指针(slow)一次走一步,当 fast.next == null 时,slow 正好指向中间结点。


所以我们便确定了一个判断条件 fast.next == null。

偶数个结点,对于偶数来说有两个中间结点,则返回第二个中间结点。其实我们可以稍微做一下转换。例如有一个链表长度为4,我们可以在该链表尾部虚拟一个 null  结点,如下图

我们就可以把偶数个结点的链表看成奇数个结点的链表,只不过判断条件 变成fast == null。

所以我们便又确定了一个判断条件 fast == null。

综上所述,我们的代码就可以写成如下形式

 while(fast.next != null && fast != null){//这两个条件必须同时满足
 ....
 }

    这里有个细节问题,如果我们写成 fast.next != null && fast != null 编译器可能会报出空指针异常。

在偶数结点的链表中,fast最后为null。判断条件时 就会先执行 fast.next != null  而非 fast != null 所以就会出现 空指针异常的情况 ,我们所要做的就是把两个条件的位置换一下。

while(fast != null && fast.next != null){
    fast = fast.next.next;
    slow = slow.next;

代码实现

class Solution {
    public ListNode middleNode(ListNode head) {
        if(head.next == null) return head;//当链表为null时,直接返回
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }


相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
64 1
|
16天前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
9 1
|
2月前
链表的中间结点
链表的中间结点
178 57
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
23 3
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
16 0
|
3月前
|
存储 Java
|
3月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
3月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
100 0
|
3月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。