链表的反转就像是一场精巧的密码破解游戏,在指针的舞动中解开数据的奥秘。今天让我们一起探索力扣经典题目"反转链表"(206题),感受算法中的简单之美!
题目描述:反转链表(206. Reverse Linked List)
题目要求:给你单链表的头节点 head
,反转链表后返回反转后的链表。
示例:
输入: 1→2→3→4→5
输出: 5→4→3→2→1
难度:★☆☆☆☆(简单) 通过率:高达75.3%!非常适合算法初学者入门
链表的魔力
想象链表就像一列火车车厢:
[车头] → [车厢1] → [车厢2] → [车厢3] → [车尾]
反转链表的魔法就是让这列火车完美倒车:
[车尾] → [车厢3] → [车厢2] → [车厢1] → [车头]
解法1:迭代法(三指针舞步)
核心思路:使用三个指针(前驱、当前、后继)在链表中"翩翩起舞"
Java实现:
public ListNode reverseList(ListNode head) {
ListNode prev = null; // 前驱指针(车厢前的位置)
ListNode curr = head; // 当前指针(当前车厢)
while (curr != null) { // 沿着轨道向前行进
ListNode nextTemp = curr.next; // 记住下一个车厢位置
curr.next = prev; // 修改当前车厢的连接方向
prev = curr; // 前驱指针前进
curr = nextTemp; // 当前指针前进
}
return prev; // 最终prev就是新的车头
}
指针舞动分析:
初始状态:
prev = null
curr = 1 → 2 → 3 → 4 → 5
第1轮:
nextTemp = 2
1 → null (反转第一根链条)
prev = 1
curr = 2
第2轮:
nextTemp = 3
2 → 1 → null
prev = 2
curr = 3
重复过程...
最终:5→4→3→2→1→null
解法2:递归法(时间倒流术)
魔法原理:将复杂问题分解为简单问题:"先反转后面的车厢,再处理当前车厢"
public ListNode reverseListRecursive(ListNode head) {
// 基本情况:空链表或单个节点无需反转
if (head == null || head.next == null) {
return head;
}
// 魔法咒语:反转后面的所有车厢
ListNode newHead = reverseListRecursive(head.next);
// 当前车厢的下一个车厢应该指向自己(反转连接)
head.next.next = head;
// 切断自己原来的连接
head.next = null;
return newHead; // 新的车头永远是最深处的车厢
}
递归堆栈展开:
reverse(1)
reverse(2)
reverse(3)
reverse(4)
reverse(5) → 直接返回5
4.next.next=4 → 5→4
4.next=null
3.next.next=3 → 5→4→3
3.next=null
2.next.next=2 → 5→4→3→2
2.next=null
1.next.next=1 → 5→4→3→2→1
1.next=null
返回5
方法对比:双剑合璧
方法 |
时间复杂度 |
空间复杂度 |
适用场景 |
迭代法 |
O(n) |
O(1) |
内存受限环境 |
递归法 |
O(n) |
O(n) |
代码简洁/链表不长时 |
小贴士:面试中通常优先用迭代法,避免递归的栈溢出风险!
趣味应用场景
- 文字处理软件:文档中的"撤销"功能底层实现
- 浏览器历史记录:最近访问页面的排序展示
- 音乐播放器:实现倒放功能的音频处理
- 区块链技术:交易记录的历史回溯
- 电梯控制系统:反向运行时的调度算法
魔法挑战升级
掌握了基本反转后,来挑战这些变体题目吧:
- 区间反转(92题):反转链表指定区间
- 输入: 1→2→3→4→5, m=2, n=4
- 输出: 1→4→3→2→5
- K个一组反转(25题):每K个节点为一组进行反转
- 输入: 1→2→3→4→5, k=3
- 输出: 3→2→1→4→5
- 回文链表(234题):使用反转技巧判断回文
// 巧用快慢指针+反转后半段
public boolean isPalindrome(ListNode head) {
ListNode slow = head, fast = head;
// 找中点...
// 反转后半段...
// 比较前后两段...
}
总结:指针的华尔兹
反转链表这道简单的题目教会我们:
- 指针操作是链表算法的核心魔法
- 分治思想(递归法)能优雅解决复杂问题
- 空间换时间/时间换空间的权衡艺术
每个伟大的程序员都从反转第一个链表开始。这看似简单的三步舞(保存-反转-前进)将成为你算法工具箱中最常用的魔法咒语之一。记住:编程之道,始于链舞!
练习建议:在白纸上手动画出指针移动过程,这是掌握链表类题目的不二法门!