力扣_876. 链表的中间结点

力扣_876. 链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

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

输入:head = [1,2,3,4,5]

输出:[3,4,5]

解释:链表只有一个中间结点,值为 3 。

输入:head = [1,2,3,4,5,6]

输出:[4,5,6]

解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

思路是遍历两次链表,第一遍用来统计链表长度size,对长度模运算判断是否为奇偶数后,第二遍遍历链表取中间结点;一开始还对使用了if判断,想着偶数的话节点取size/2+1,奇数节点取size/2,后来发现直接取size/2就行啦。

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    public ListNode middleNode(ListNode head) {
        int size = 0;
        ListNode current = head;
        while (current != null) {
            size++;
            current = current.next;
        }
        int index = size / 2;
        ListNode cur = head;
        // 获取链表中某个位置的元素
        for (int i = 1; i <= index; i++) {
            cur = cur.next;
        }
        return cur;
    }
}

看了题解后发现还是快慢指针法牛,一开始还不明白为什么当快指针到达链表的末尾时,慢指针正好指向链表的中间节点。ai了一下懂了,假设链表的长度为 n。我们从头开始,快慢指针都指向链表的第一个节点。快指针的移动速度比慢指针快,因此,快指针的每一步移动相当于慢指针的两步。当快指针走到链表的末尾时,它已经走过了大约 n 步。慢指针每次只走一步,所以它的移动速度相对较慢。由于快指针走得更快,当快指针走到链表的末尾时,慢指针实际上已经走过了 n/2 步。在这段过程中,慢指针每次走一步,它会在快指针走 n 步时,正好走过 n/2 步。妙蛙种子!

相关推荐
前端小L1 小时前
回溯算法专题(八):精细化切割——还原合法的「IP 地址」
数据结构·算法
Hcoco_me7 小时前
大模型面试题17:PCA算法详解及入门实操
算法
跨境卫士苏苏7 小时前
亚马逊AI广告革命:告别“猜心”,迎接“共创”时代
大数据·人工智能·算法·亚马逊·防关联
HerayChen7 小时前
HbuilderX 内存溢出报错
java·大数据·linux
程序员小白条8 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
云雾J视界8 小时前
当算法试图解决一切:技术解决方案主义的诱惑与陷阱
算法·google·bert·transformer·attention·算法治理
Xの哲學8 小时前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
小马爱打代码8 小时前
Spring AI:搭建自定义 MCP Server:获取 QQ 信息
java·人工智能·spring
郭涤生8 小时前
QT 架构笔记
java·数据库·系统架构
daidaidaiyu8 小时前
基于LangGraph开发复杂智能体学习一则
java·ai