题目描述给你单链表的头节点head请你反转链表并返回反转后的链表。示例 1text输入head [1,2,3,4,5] 输出[5,4,3,2,1]示例 2text输入head [1,2] 输出[2,1]示例 3text输入head [] 输出[]提示链表中节点的数目范围是[0, 5000]-5000 Node.val 5000解题思路反转链表是面试中最高频的链表题目之一同时也是很多复杂链表题的基础。核心思想是改变每个节点的 next 指针方向让它指向前一个节点。本文将介绍两种经典解法迭代法双指针/三指针—— 空间 O(1)最推荐递归法—— 代码简洁但需要理解递归调用栈解法一迭代法双指针这是最直观、最推荐的解法也是面试官最希望看到的写法。算法步骤定义两个指针prev指向已反转部分的头节点初始为nullcurr指向当前待反转的节点初始为head遍历链表每次迭代先保存curr.next否则反转后会丢失将curr.next指向prev反转当前节点移动prev和curr到下一个位置当curr为null时prev就是新链表的头节点图解过程以head [1, 2, 3, 4, 5]为例text初始状态: null ← 1 → 2 → 3 → 4 → 5 prev curr 第一步: 反转 1 的指向 null ← 1 2 → 3 → 4 → 5 prev curr 第二步: 反转 2 的指向 null ← 1 ← 2 3 → 4 → 5 prev curr 第三步: 反转 3 的指向 null ← 1 ← 2 ← 3 4 → 5 prev curr 第四步: 反转 4 的指向 null ← 1 ← 2 ← 3 ← 4 5 prev curr 第五步: 反转 5 的指向 null ← 1 ← 2 ← 3 ← 4 ← 5 prev curr null 返回 prev (即节点 5)代码实现javaclass Solution { public ListNode reverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode nextTemp curr.next; // 保存下一个节点 curr.next prev; // 反转当前节点的指针 prev curr; // prev 前进一步 curr nextTemp; // curr 前进一步 } return prev; // prev 就是新链表的头节点 } }复杂度分析时间复杂度O(n)遍历一次链表空间复杂度O(1)只用到了常数个指针解法二递归法递归法代码非常简洁但理解起来需要一点想象力。核心思想递归到链表的最后一个节点该节点就是反转后的头节点记为newHead。在回溯过程中让当前节点的下一个节点的next指向当前节点。将当前节点的next设为null避免形成环。图解过程text原始链表: 1 → 2 → 3 → 4 → 5 → null 递归深入: reverseList(1) └─ reverseList(2) └─ reverseList(3) └─ reverseList(4) └─ reverseList(5) └─ 返回 5 (newHead) 回溯过程: 第1层回溯(节点4): 让 5.next 4, 4.next null 结果: 1→2→3→4 null←5 (4←5) 第2层回溯(节点3): 让 4.next 3, 3.next null 结果: 1→2→3 null←4←5 (3←4←5) 第3层回溯(节点2): 让 3.next 2, 2.next null 结果: 1→2 null←3←4←5 (2←3←4←5) 第4层回溯(节点1): 让 2.next 1, 1.next null 结果: null←1←2←3←4←5 最终返回 newHead 5代码实现javaclass Solution { public ListNode reverseList(ListNode head) { // 递归终止条件空链表或只有一个节点 if (head null || head.next null) { return head; } // 递归反转后面的链表 ListNode newHead reverseList(head.next); // 回溯时反转当前节点 // head.next 是原链表中的下一个节点 // 让它指向 head完成反转 head.next.next head; head.next null; return newHead; } }复杂度分析时间复杂度O(n)每个节点访问一次空间复杂度O(n)递归调用栈的深度为链表长度递归法常见疑问Q: 为什么要先保存newHeadA: 因为最后一个节点就是反转后的头节点需要在递归最深处确定然后原封不动地返回到最外层。Q:head.next.next head是什么操作A: 假设当前是节点khead.next是k1。head.next.next head就是让k1的next指向k完成反转。Q: 为什么要head.next nullA: 避免形成循环。如果不置空原来的head.next仍然指向下一个节点而下一个节点已经指回来了就会形成环。两种解法对比维度迭代法递归法时间复杂度O(n)O(n)空间复杂度O(1)O(n)递归栈代码长度稍长但清晰极短但需理解易于理解✅ 直观❌ 需要递归思维面试推荐⭐⭐⭐⭐⭐⭐⭐⭐可作为加分项风险低链表过长可能栈溢出建议优先掌握迭代法递归法作为思维拓展。扩展思考1. 反转部分链表LeetCode 92. 反转链表 II只反转从位置left到right的节点其余保持原序。思路先找到第left-1个节点pre反转[left, right]区间内的节点将pre.next指向反转后的头区间尾部的next指向原right.next2. K 个一组反转链表LeetCode 25. 反转链表 II这是反转链表的进阶版本难度较大。核心思路先判断剩余节点是否足够 K 个反转当前 K 个节点递归或迭代处理下一组3. 双向链表的反转双向链表反转更简单除了改变next还要同步改变prev指针。常见错误与注意事项忘记保存curr.next反转curr.next后会丢失原链表的下一个节点导致遍历中断。返回值错误迭代法返回的是prev而不是curr此时curr为null。递归法忘记处理head.next null会导致环出现遍历时会死循环。边界条件空链表或单节点链表需要特殊处理递归法的终止条件已覆盖。面试话术如果面试官让你写反转链表推荐这样回答“反转链表的核心是改变每个节点的next指针方向。我可以用迭代法实现时间复杂度 O(n)空间复杂度 O(1)。具体做法是定义prev和curr两个指针每次让curr.next指向prev然后两个指针同步后移最后返回prev即可。”如果能再补充递归解法会是加分项“递归法的思路是先递归到链表末尾返回新头节点然后在回溯过程中让下一个节点指向当前节点并断开当前节点的原next指针避免形成环。”总结解法核心操作空间难度迭代curr.next prev 双指针移动O(1)⭐递归head.next.next head 回溯O(n)⭐⭐⭐反转链表是所有链表题目的基石一定要手写无 Bug掌握。建议先彻底理解迭代法的每一步可以用纸笔模拟再尝试理解递归法的回溯过程最后刷几道变种题反转部分、K 个一组巩固