当前位置: 首页 > java >正文

链表反转_leedcodeP206

P206反转链表

原题
在这里插入图片描述

反转思路
将链表反转的过程分为两个区域:

🟦 未反转区(待处理)

原链表中还没有处理(还没有反转指针方向)的部分,从 current 开始一直到链表尾部。

🟩 已反转区(处理完成)

已经反转过来的部分,从 previous 开始,指针方向已经翻转。


我们以一个例子来解释:
假设初始链表是:1 -> 2 -> 3 -> 4 -> 5 -> null


初始状态:

🟩 已反转区:null
🟦 未反转区:1 -> 2 -> 3 -> 4 -> 5 -> null↑current

第一次循环后:

  • currentnext 改指向 previous,也就是让 1 -> null
  • 然后指针往前推进:
🟩 已反转区:1 -> null
🟦 未反转区:2 -> 3 -> 4 -> 5 -> null↑current

第二次循环后:

  • 2 -> 1
  • 指针继续前进
🟩 已反转区:2 -> 1 -> null
🟦 未反转区:3 -> 4 -> 5 -> null↑current

第三次循环后:

🟩 已反转区:3 -> 2 -> 1 -> null
🟦 未反转区:4 -> 5 -> null↑current

第四次循环后:

🟩 已反转区:4 -> 3 -> 2 -> 1 -> null
🟦 未反转区:5 -> null↑current

第五次(最后)循环前:

此时 next == nullcurrent 指向最后一个节点 5。我们还要将 current.next = previous,也就是 5 -> 4

🟩 已反转区:5 -> 4 -> 3 -> 2 -> 1 -> null
🟦 未反转区:null

总结逻辑流程:

  1. 用三个指针遍历链表(previouscurrentnext
  2. 每次循环把 current 指向 previous,并向前推进
  3. 循环终止时,current 是原链表的尾部,也就是反转后的头部

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

public ListNode reverseList(ListNode head) {// 如果链表为空或者链表只有一个节点,直接返回头节点if (head == null || head.next == null) {return head;}// 初始化三个指针:// current 指向当前节点// next 指向下一个节点(即 current 的下一个节点)// previous 用来记录前一个节点(初始时为空)ListNode current = head;  // 当前节点ListNode next = current.next;  // 下一个节点ListNode previous = null;  // 反转后的部分链表的尾部(初始化为空)// 遍历链表,直到 next 为 null,即遍历完所有节点while (next != null) {// 将 current 的 next 指向 previous,反转当前节点current.next = previous;// 移动 previous 和 current,准备反转下一个节点previous = current;  // previous 向前移动,变成当前节点current = next;  // current 向前移动,变成下一个节点next = next.next;  // next 向前移动,变成下一个节点的下一个节点}// 最后,current(原始链表的最后一个节点)指向反转后的链表的头部current.next = previous;// 返回新的链表头节点return current;
}

时间复杂度O(N)
空间复杂度O(1)


递归实现

思路:通过递归将链表的尾部逐步返回,等递归到底(也就是 head.next == null)时,从尾节点开始一步步回溯。在回溯过程中,将当前节点的 next.next 指向自身,相当于逐步反转指针方向,同时把自己的 next 指向 null 来断链,最终形成完整的反转链表。

public ListNode reverseList(ListNode head) {if(head==null||head.next==null){return head;}List next=reverseList(head.next);head.next.next=head;//反转head.next=null;return next;	
}

时间复杂度O(N)
空间复杂度ON)

http://www.xdnf.cn/news/2872.html

相关文章:

  • 判断图片url损坏无法展示工具类
  • UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别
  • 关于本地端口启动问题
  • JAVA--- 关键字static
  • 长效住宅IP是什么?如何获取长效住宅IP?
  • 工程管理部绩效考核关键指标与项目评估
  • 选择排序快速排序
  • 国标GB28181视频平台EasyCVR实用方案:如何实现画面拉伸
  • 大厂Java面试深度解析:Dubbo服务治理、WebSocket实时通信、RESTEasy自定义注解与C3P0连接池配置实践
  • 信创开发中的数据库详解:国产替代背景下的技术生态与实践指南
  • 百度「心响」:通用超级智能体,重新定义AI任务执行新范式
  • Linux CentOS 7 安装Apache 部署html页面
  • 前端 AI 开发实战:基于自定义工具类的大语言模型与语音识别调用指南
  • 2025.4.29_STM32_看门狗WDG
  • 通过全局交叉注意力机制和距离感知训练从多模态数据中识别桥本氏甲状腺炎|文献速递-深度学习医疗AI最新文献
  • 前端防护利器:disable-devtool 使用指南 - 保护你的Web应用安全
  • JAVA---集合ArrayList
  • 《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》
  • Spring中bean的生命周期(笔记)
  • LeetCode热题100--53.最大子数组和--中等
  • 最新的30个Android Kotlin面试题
  • Kafka的Rebalance机制可能引发什么问题?如何优化?怎么减少不必要的Rebalance
  • 第十六届蓝桥杯 2025 C/C++组 密密摆放
  • Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解
  • FastGPT部署的一些问题整理
  • 对 FormCalc 语言支持较好的 PDF 编辑软件综述
  • 短视频矩阵批量剪辑与场景剪辑功能 OEM 定制开发
  • C++——调用OpenCV和NVIDIA Video Codec SDK库实现使用GPU硬解码MP4视频文件
  • 【深度学习与大模型基础】第14章-分类任务与经典分类算法
  • 从 BERT 到 GPT:Encoder 的 “全局视野” 如何喂饱 Decoder 的 “逐词纠结”