链表的基本操作:反转、合并、查找中点、检测环等
❓ 什么是链表操作?
链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。 与数组不同,链表的元素在内存中不连续存储,通过指针连接。 链表的基本操作包括: - **遍历**:从头节点开始,通过 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) 递归
通常只需遍历一次,空间取决于使用迭代还是递归
按?查看快捷键