链表篇(五)——链表中间结点

目录

一、题目本质

二、解法

三、复杂度分析

四、变形训练

变体1:返回第一个中间结点

变体2:三分之一位置

变体3:配合断链,用于归并排序找中点

五、自检


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

一、题目本质

核心模型快慢指针速度差------快指针速度是慢指针的 2 倍,快指针到末尾时,慢指针刚好在中间。

这是快慢指针三大应用之一(定差距、速度差、追及判环)。

二、解法

cpp 复制代码
   ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode dummy(0, head);
    stack<ListNode*> st;
    
    ListNode* p = &dummy;
    while (p) {
        st.push(p);
        p = p->next;
    }
    
    // 弹出 n 个,栈顶就是待删结点的前驱
    for (int i = 0; i < n; i++) st.pop();
    ListNode* prev = st.top();
    
    ListNode* del = prev->next;
    prev->next = prev->next->next;
    delete del;
    
    return dummy.next;
}

核心不变量 :任意时刻,slow 走过的步数 = fast 走过步数的一半。

证明:

  • 初始:slow 走 0 步,fast 走 0 步,0 = 0/2 ✓

  • 每轮:slow 走 1 步,fast 走 2 步,比例始终 1:2

当 fast 到末尾(走了 n 步),slow 刚好走了 n/2 步,即中间位置。

按照题目要求,返回第二个中间节点。

cpp 复制代码
初始:
1 → 2 → 3 → 4 → 5 → 6
↑
slow, fast

第 1 轮:slow=2, fast=3
第 2 轮:slow=3, fast=5
第 3 轮:slow=4, fast=null

slow 停在 4,正是第二个中间结点 ✓

三、复杂度分析

每个结点至多被 fast 访问一次。

四、变形训练

变体1:返回第一个中间结点

只需让 fast 起步就领先一步(即相当于让slow少走一步)

cpp 复制代码
ListNode* fast = head->next;  // 起手就领先

变体2:三分之一位置

快指针速度改为慢指针的 3 倍。

cpp 复制代码
ListNode* oneThirdNode(ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
    
    while (fast && fast->next && fast->next->next) {
        slow = slow->next;
        fast = fast->next->next->next;  // 3 倍速
    }
    return slow;  // 停在约 1/3 处
}

变体3:配合断链,用于归并排序找中点

cpp 复制代码
ListNode* getMidAndCut(ListNode* head) {
    if (!head || !head->next) return head;
    
    ListNode* slow = head;
    ListNode* fast = head->next;  // 找第一个中点
    ListNode* prev = nullptr;     // 记录 slow 的前驱,用于断链
    
    while (fast && fast->next) {
        prev = slow;
        slow = slow->next;
        fast = fast->next->next;
    }
    
    // 断链
    if (prev) prev->next = nullptr;
    return slow;
}

五、自检

  • 能闭眼写出返回第二个中点的版本

  • 能改成返回第一个中点(fast=head->next)

  • 能解释循环条件是 fast && fast->next

  • 知道怎么改成 1/3 位置

  • 能写出带断链的版本(配合归并排序)

相关推荐
千寻xun8 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
CS创新实验室9 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
海石11 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石11 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx11 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
imbackneverdie12 小时前
AI4S不止于分子药物:以MedPeer为代表的科研基建打开产业新增量
大数据·人工智能·算法·aigc·科研·学术·ai 4s
额鹅恶饿呃13 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
Piko61414 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
AOwhisky14 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
运行时记录14 小时前
prompt-optimizer skill
算法