当前位置: 首页 > news >正文

LeetCode-链表-反转链表+链表的中间结点

image-20250520203051704

LeetCode-链表-反转链表+链表的中间结点

✏️ 关于专栏:专栏用于记录 prepare for the coding test


文章目录

  • LeetCode-链表-反转链表+链表的中间结点
    • 📝 反转链表
      • 🎯题目描述
      • 🔍 输入输出示例
      • 🧩题目提示
      • 🧪AC
    • 📝 链表的中间结点
      • 🎯题目描述
      • 🔍 输入输出示例
      • 🧩题目提示
      • 🧪AC
    • 🌟 总结
      • ✅ 反转链表
      • ✅ 链表的中间结点

📝 反转链表

🎯题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

🔗题目链接:反转链表

🔍 输入输出示例

示例 1:

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

示例 2:

img
输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

🧩题目提示

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

🧪AC

简单理解:比如链表为 1→2→3。创建一个新的空链表,然后用头插法依次把节点 1,2,3 插到这个新链表的头部,就得到了链表 3→2→1,这正是反转后的链表。

image-20250521073407374 image-20250521074639304
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr;ListNode* cur = head;while(cur){ListNode* nnxt = cur->next;cur->next = pre;pre = cur;cur = nnxt;}return pre;}
};

📝 链表的中间结点

🎯题目描述

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

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

🔗题目链接:链表的中间结点

🔍 输入输出示例

示例 1:

img
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

img
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

🧩题目提示

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100

🧪AC

可以利用「快慢指针」技巧来找到链表的中间节点。具体做法是定义两个指针:fastslow,其中 fast 每轮移动两步,slow 每轮移动一步。由于 fast 的移动速度始终是 slow 的两倍,当 fast 遍历完整个链表时,slow 恰好位于中间位置。

根据链表长度的不同,需区分以下两种情况:

  • 链表长度为奇数:当 fast 指向最后一个节点时,slow 正好指向链表的中间节点。
  • 链表长度为偶数:当 fast 越过尾节点(即指向 null)时,slow 此时指向的是两个中间节点中的第二个。

因此,我们可以在 fast 到达尾节点或越界时结束循环,并返回 slow 所指的位置作为中间节点。

image-20250521082408182

image-20250521082641153
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode* fast = head;ListNode* slow = head;while(fast&&fast->next){fast = fast->next->next;slow = slow->next;}return slow;}
};

🌟 总结

✅ 反转链表

  • 运用 迭代法,通过 cur 遍历原链表,利用一个 pre 指针记录反转后的链表头。
  • 关键在于每次保存 cur->next,以防链表断裂,然后逐步“头插”到新的链表中。
  • 该方法时间复杂度为 O(n),空间复杂度为 O(1),高效稳定。

✅ 链表的中间结点

  • 使用 快慢指针法(Two Pointers) 快速定位中间结点。
  • fast 每次走两步,slow 每次走一步,fast 走完时,slow 恰好在中点。
  • 可统一处理奇偶长度链表:当 fastnullptrfast->next == nullptr 时停止,返回 slow 即可。

使用 快慢指针法(Two Pointers) 快速定位中间结点。

  • fast 每次走两步,slow 每次走一步,fast 走完时,slow 恰好在中点。
  • 可统一处理奇偶长度链表:当 fastnullptrfast->next == nullptr 时停止,返回 slow 即可。

将两者结合又将产生什么样的火花呢?参加LeetCode-234回文链表,下篇博客我们将一起探究这道题~

相关文章:

  • Android Handler/Looper线程管理实战攻略:从零到企业级开发
  • Java详解LeetCode 热题 100(18):LeetCode 73. 矩阵置零(Set Matrix Zeroes)详解
  • 【面试题】Session 和 Cookie 的区别
  • C++之内存分配new与 delete
  • 云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)
  • 计算机网络学习(一)—— OSI vs TCP/IP网络模型
  • 【Linux】第二十五章 运行容器
  • 量子计算与云计算的融合:技术前沿与应用前景
  • COMPUTEX 2025 | 广和通创新解决方案共筑AI交互新纪元
  • Ubuntu 20.04卸载并重装 PostgreSQL
  • 【算法创新+设计】灰狼算法GWO+扰动算子,求解大规模TSP问题利器
  • 基于python的机器学习(七)—— 数据特征选择
  • (八)深度学习---计算机视觉基础
  • 大语言模型 16 - Manus 超强智能体 Prompt分析 原理分析 包含工具列表分析
  • 【notepad++如何设置成中文界面呢?】
  • 通信协议详解(分层技术解析)
  • vue3使用 Tailwind CSS (4.多版本)
  • Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》
  • OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
  • pikachu靶场 暴力破解
  • 网站设计分析/今日热点事件
  • 做情趣用品网站需要哪些资质/企业专业搜索引擎优化
  • 安徽省工程招标信息网/seo网站优化推广教程
  • 厦门网站建站/科技网站建设公司
  • 广州建站方法/湖北百度seo
  • 西安学校网站建设哪家专业/百度问答怎么赚钱