链表的基本操作:反转、合并、查找中点、检测环等

什么是链表操作

链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。 与数组不同,链表的元素在内存中不连续存储,通过指针连接。 链表的基本操作包括: - **遍历**:从头节点开始,通过 next 指针逐个访问 - **反转**:改变每个节点的 next 指针方向 - **合并**:将两个链表按规则连接 - **查找**:使用快慢指针找中点、检测环

🎯 为什么使用?

链表在以下场景有优势: 1. **频繁插入删除**:O(1) 时间插入删除(已知位置) 2. **动态大小**:不需要预分配固定空间 3. **内存利用**:可以利用碎片化内存 常见链表问题类型: - 反转类:整体反转、部分反转、K个一组反转 - 合并类:合并有序链表、合并K个链表 - 快慢指针:找中点、检测环、找环入口 - 双指针:删除倒数第N个节点、相交链表

⚙️ 如何工作?

链表操作的核心技巧: **1. 虚拟头节点(Dummy Node)** 当头节点可能被删除或改变时,使用虚拟头节点简化边界处理: ``` const dummy = new ListNode(0); dummy.next = head; // 操作后返回 dummy.next ``` **2. 双指针/快慢指针** - 找中点:slow 走一步,fast 走两步 - 找环:快慢相遇则有环 - 找环入口:相遇后,一个从头开始,再次相遇即入口 **3. 反转链表** 核心是三个指针:prev(已反转)、curr(当前)、next(待反转) ``` while (curr) { next = curr.next; // 保存下一个 curr.next = prev; // 反转指向 prev = curr; // 移动 prev curr = next; // 移动 curr } ``` **4. 递归思维** 链表天然适合递归,因为链表本身就是递归结构(头节点 + 剩余链表)

🎨 形象比喻

想象一列火车: - 每节车厢是一个**节点** - 车厢之间的连接是 **next 指针** - 反转链表就像让每节车厢的连接方向反过来 - 找中点就像两个人从头开始走,一个走两步一个走一步,快的到终点时慢的在中间 - 检测环就像在圆形赛道上,跑得快的人一定会追上跑得慢的人

🔍 识别关键词

当你在题目中看到以下关键词时,考虑使用链表操作

链表节点反转合并中点相交

📊 时间空间复杂度

时间复杂度
O(n)
空间复杂度
O(1) 迭代 / O(n) 递归

通常只需遍历一次,空间取决于使用迭代还是递归

?查看快捷键