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

链表反转_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)

相关文章:

  • 如何查看和验证AWS CloudFront的托管区域ID
  • Vue + ECharts 实现多层极坐标环形图
  • 通过AWS Console连接服务器,简化运维过程
  • 企业出海降本:如何将应用从 AWS EC2 快速无缝迁移至DigitalOcean Droplet
  • 揭开应用程序的神秘面纱:深入了解 AWS X-Ray
  • 【docker】启动临时MongoDB容器、挂载数据卷运行数据库服务,并通过备份文件恢复MongoDB数据库备份数据
  • SQLMesh增量模型实战指南:时间范围分区
  • nginx 核心功能
  • 鸟笼效应——AI与思维模型【84】
  • 组件轮播与样式结构重用实验
  • Android开发——实现一个计算器
  • 利用3DMAX + Corona Renderer打造现代住宅逼真效果!
  • DotNet 入门:(一) 环境安装
  • MarkItDown:如何高效将各类文档转换为适合 LLM 处理的 Markdown 格式
  • 进程优先级以及切换调度
  • 得物 小程序 6宫格 分析
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 16)
  • opencv 直方图均衡化
  • AimRT 从零到一:官方示例精讲 —— 三、Executor示例.md
  • 【AI News | 20250429】每日AI进展
  • 宋徽宗《芙蓉锦鸡图》亮相,故宫首展历代动物绘画
  • 以“最美通缉犯”为噱头直播?光明网:违法犯罪不应成网红跳板
  • 在循环往复的拍摄中,重新发现世界
  • 跨海论汉|专访白馥兰:对中国农业史的兴趣,从翻译《齐民要术》开始
  • 这场迪图瓦纪念拉威尔的音乐会,必将成为乐迷反复品味的回忆
  • 四川邻水县县长石国平拟任县(市、区)党委书记