递归反转单链表的核心是让后续节点先反转,再将当前节点接至已反转部分末尾,返回原链表尾节点;迭代法用prev、curr、nexttemp三指针边遍历边翻转,返回prev。

递归方式反转单链表
递归的核心思想是:先让后续节点完成反转,再把当前节点接到已反转部分的末尾。关键在于理解“返回值”代表什么——每次递归调用都应返回新链表的头节点(即原链表的尾节点)。
操作步骤如下:
- 递归终止条件:当前节点为空或只有头节点(head == null || head.next == null),直接返回 head
- 递归调用:newHead = reverseList(head.next),得到以原链表第二个节点为头的反转后链表的新头
- 调整指针:让 head.next.next = head,把原头节点接在新链表尾部
- 断开原连接:head.next = null,避免成环
- 返回 newHead(始终是原始链表最后一个节点)
非递归(迭代)方式反转单链表
迭代法用三个指针控制方向转换:prev(前一个节点)、curr(当前处理节点)、nextTemp(暂存下一个节点)。核心是“边遍历边翻转指针”,不依赖函数调用栈。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
具体步骤如下:
- 初始化:prev = null,curr = head
- 循环条件:curr != null
- 每轮操作:
- 保存下一个节点:nextTemp = curr.next
- 反转当前连接:curr.next = prev
- 向前推进:prev = curr,curr = nextTemp
- 循环结束时,prev 指向原链表尾节点,即新链表头节点,返回 prev
两种方式对比与注意事项
递归写法简洁,但会占用 O(n) 栈空间;迭代更省内存,时间复杂度都是 O(n),空间复杂度分别为 O(n) 和 O(1)。
常见易错点:
- 递归中忘记置空 head.next,导致链表成环
- 迭代中未提前保存 curr.next,导致后续节点丢失
- 返回值弄错:递归必须返回 newHead(最深层的 tail),不是 head;迭代返回的是 prev,不是 curr
- 边界处理:空链表和单节点链表都要能正确返回原 head
代码片段参考(Java)
// 递归实现
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;
}
// 迭代实现
public ListNode reverseList(ListNode head) {
ListNode prev = null, curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










