翻转链表,内附动画
# 翻转链表 ### 链表定义 ```java /** * @author wangli66 * @describtion 翻转链表 * 反转一个单链表。 * 示例: * 输入: 1->2->3->4->5->NULL * 输出: 5->4->3->2->1->NULL */ public class ListNode{ int val;// 保存的值 ListNode next;// 指向下个节点的指针 ListNode(int x) { val = x; } } ``` ### 双指针解法 我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。 第二个指针 cur 指向 head,然后不断遍历 cur。 每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。 都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。  ```java /** * @Description: 双指针解法 * @return: com.example.demo.leetcode.queues.ListNode * @Date: 2020/4/10 */ public ListNode reverseList(ListNode head) { //申请节点,pre和 cur,pre指向null ListNode pre = null; ListNode cur = head; ListNode tmp = null; while(cur!=null) { //记录当前节点的下一个节点 tmp = cur.next; //然后将当前节点指向pre cur.next = pre; //pre和cur节点都前进一位 pre = cur; cur = tmp; } return pre; } ``` ### 递归解法 终止条件是当前节点或者下一个节点==null 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句 head.next.next = head  ```java /** * @Description:递归解法 * @param: [head] * @return: com.example.demo.leetcode.queues.ListNode * @Date: 2020/4/10 */ public ListNode recursiveReverse(ListNode head) { //递归终止条件是当前为空,或者下一个节点为空 if(head==null || head.next==null) { return head; } //这里的cur就是最后一个节点 ListNode cur = reverseList(head.next); //如果链表是 1->2->3->4->5,那么此时的cur就是5 //而head是4,head的下一个是5,下下一个是空 //所以head.next.next 就是5->4 head.next.next = head; //防止链表循环,需要将head.next设置为空 head.next = null; //每层递归函数都返回cur,也就是最后一个节点 return cur; } ```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术