文章目录
-
- 一、题目描述
- 二、问题本质与考察点
- 三、思维导图
- 四、迭代解法(Iterative Approach)
-
-
- 原理说明
-
- 流程图示意
-
- Java 实现代码
-
- 时间与空间复杂度分析
-
- 五、递归解法(Recursive Approach)
-
-
- 原理说明
-
- 时序图说明递归流程
-
- Java 实现代码
-
- 时间与空间复杂度分析
-
- 六、两种解法对比总结
一、题目描述
给定一个单链表的头节点 head,请将该链表反转,并返回反转后的链表头节点。
示例:
输入:head = [1, 2, 3, 4, 5]
输出:[5, 4, 3, 2, 1]
二、问题本质与考察点
这道题是链表操作的入门题,核心考察的是:
- 对链表节点指针的操作理解;
- 指针反转逻辑;
- 如何用迭代或递归的思维去解决。
三、思维导图
下面是本题的知识结构与思路概览:
反转链表
原理
数据结构:单链表
核心操作:指针翻转
解法类型
迭代法
递归法
分析
n
空间复杂度 O(1) 或 O(n)(递归)
关键难点
指针变化过程理解
四、迭代解法(Iterative Approach)
1. 原理说明
迭代法的思路非常直观:
从链表的头节点开始,逐节点反转它们的 next 指针方向,直到链表末尾。
要使用三个指针变量:
prev:指向当前节点的前一个节点(初始为null)cur:指向当前遍历的节点next:保存当前节点的下一个节点
每一步操作如下:
- 保存下一个节点:
next = cur.next - 反转指针方向:
cur.next = prev - 前移指针:
prev = cur cur指向下一个节点:cur = next
直到 cur 为空,此时 prev 即为反转后的链表新头节点。
2. 流程图示意
是
否
开始
初始化 prev = null, cur = head
cur != null?
保存 next = cur.next
反转 cur.next = prev
移动 prev = cur
移动 cur = next
返回 prev
结束
3. Java 实现代码
java
public class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
4. 时间与空间复杂度分析
- 时间复杂度:O(n),其中 n 为链表节点数,每个节点只遍历一次。
- 空间复杂度:O(1),使用常量级辅助变量,不占额外空间。
五、递归解法(Recursive Approach)
1. 原理说明
递归法的思想是:
- 将当前节点之后的链表反转;
- 把当前节点接到反转后的尾部。
递归的关键在于: 反转子链表后,调整指针方向。
假设 head 指向链表头,调用 reverseList(head.next) 得到反转后的子链表 newHead。
再将当前节点 head 接在子链表尾部:
java
head.next.next = head;
head.next = null;
最后返回 newHead 即可。
2. 时序图说明递归流程
reverseList Main reverseList Main 调用 reverseList(head) 递归到链表末尾 返回反转后的 newHead 调整当前节点指针方向 返回新的头节点
3. Java 实现代码
java
public class Solution {
public ListNode reverseList(ListNode head) {
// 递归终止条件:空链或单节点
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
4. 时间与空间复杂度分析
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(n),递归调用栈深度为链表长度。
六、两种解法对比总结
| 解法方式 | 思路特点 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|---|
| 迭代法 | 指针循环反转,逻辑清晰且高效 | O(n) | O(1) | 推荐做法 |
| 递归法 | 利用函数栈反转链表,更简洁但占栈空间 | O(n) | O(n) | 理解递归思维 |