EcomGPT电商AI助手快速上手:左侧输入→右侧输出→底部示例三步工作流
2026/4/4 6:57:23
先看题:
line 链表是一个有序链表,现请你找出此链表的中间节点,
将此节点的值返回。
本题分为两种情况:
如果链表节点数是偶数,则取中间靠 左边/右边 的节点的值。
这是一道典型的算法例题:
常见思路
接下来便可以引入我们的快慢指针法:
两个指针从同一位置开始
移动速度不同(通常一个快,一个慢)
常用于:链表操作、检测循环、找中点
本篇文章 我们先对链表操作的找中点进行学习
关键:需要根据题意“偶数时取靠右的节点”来调整结束条件
这个算法的优势是只遍历链表一次,时间复杂度 O (n),空间复杂度 O (1),是找链表中间节点的极优解法。
那么首先 做链表的题目时 我们应首先考虑该链表为空的情况:
if (head == null) { //提示链表为空 }public static int fun(Node line){ Node slow = line.next; Node fast = line.next; // 快指针初始和慢指针同位置 // 循环条件调整 while(fast!=null&&fast.next!=null){ slow = slow.next; fast = fast.next.next; } return slow.value; }我们可以通过延迟慢指针的移动时机来实现靠左效果,核心思路是:
public static int fun(Node line){ // 1. 初始化慢指针:指向第一个有效节点(跳过空的头结点) Node slow = line.next; // 2. 初始化快指针:指向第二个有效节点 Node fast = line.next.next; // 3. 循环移动指针: // - fast != null:防止快指针走到链表末尾(奇数个节点) // - fast.next != null:防止快指针的下一个节点为空(偶数个节点) while(fast!=null&&fast.next!=null){ slow = slow.next; // 慢指针走1步 fast = fast.next.next; // 快指针走2步 } // 4. 循环结束时,慢指针正好指向中间节点,返回其值 return slow.value; }fast!=null&&fast.next!=null同时兼顾奇数 / 偶数节点场景,既避免快指针直接走到 null(奇数),也避免快指针的下一个节点为 null 时执行fast.next.next引发空指针异常(偶数),是保证函数健壮性的关键。