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

三种方法解——力扣206.反转链表

力扣206.反转链表

在这里插入图片描述


【三种方式彻底吃透】LeetCode 206. 反转链表:迭代、递归与栈的全思路解析


题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围为 [0, 5000]
  • -5000 <= Node.val <= 5000

思路总览

反转链表的本质是——把每个节点的指针方向反过来
原链表:

1 → 2 → 3 → 4 → 5 → null

反转后:

null ← 1 ← 2 ← 3 ← 4 ← 5

解法一:迭代法(双指针 · 最常用)

思路解析

使用三个指针:

  • prev:当前节点的前一个节点;
  • curr:当前节点;
  • next:暂存下一个节点,防止断链。

不断执行以下步骤:

  1. 暂存 next = curr.next
  2. 反转指针 curr.next = prev
  3. 前移指针:prev = currcurr = next
  4. curr == null 时,prev 就是新的头节点

代码实现

class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next; // 暂存下一个节点curr.next = prev;          // 反转指针prev = curr;               // 前移 prevcurr = next;               // 前移 curr}return prev; // prev 为反转后的新头节点}
}

在这里插入图片描述


解法二:递归法(结构优雅 · 思维跳跃)

思路解析

递归地反转剩余的子链表,然后让下一个节点指向自己:

  1. 递归出口:head == nullhead.next == null,直接返回 head

  2. 递归调用:ListNode newHead = reverseList(head.next)

  3. 反转当前指向:

    • head.next.next = head
    • head.next = null
  4. 返回 newHead(新头节点)


代码实现

class Solution {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;}
}

在这里插入图片描述


解法三:栈法(逻辑直观 · 空间换时间)

思路解析

利用 的 “后进先出” 特性反转链表:

  1. 遍历链表,将所有节点压入栈;
  2. 依次弹出节点,重新连接;
  3. 注意:弹出最后一个节点后,要将其 next 设为 null

这种方法结构直观,适合初学者理解指针反转的原理。


代码实现

class Solution {public ListNode reverseList(ListNode head) {if (head == null) return null;Stack<ListNode> stack = new Stack<>();ListNode curr = head;while (curr != null) {stack.push(curr);curr = curr.next;}// 弹出第一个节点作为新头ListNode newHead = stack.pop();ListNode node = newHead;while (!stack.isEmpty()) {node.next = stack.pop();node = node.next;}node.next = null; // 最后一个节点指向 nullreturn newHead;}
}

在这里插入图片描述


复杂度分析

方法时间复杂度空间复杂度特点
迭代法O(n)O(1)实用最高效
递归法O(n)O(n)(递归栈)简洁优雅
栈法O(n)O(n)(显式栈)思路直观

反转链表,就是让每个节点的 next 指向它的前一个节点——
无论是指针、递归还是栈,思路的核心都在“反转方向”。


http://www.dtcms.com/a/473964.html

相关文章:

  • 企业网站广告网站响应式是什么意思
  • 湖南省郴州市邮编东莞seo网站建设公司
  • 差分信号可以分解为共模信号与差模信号
  • **标题:发散创新:探索SSR渲染技术的深度实现****摘要**:本文将深入探讨服务端渲染(SSR)技术的原理、优势以及实
  • 计算机视觉(opencv)——MediaPipe 实现手部关键点检测与可视化
  • 贵州省建设学校官方网站昆明网络公司开发
  • 没有版权可以做视频网站吗设计之家素材
  • Tomcat是一个容器
  • Easyx图形库应用(和Server程序进行交互)
  • Python自学25 - Django快速上手
  • 太原云起时网站建设广东知名网站建设
  • AI学习日记——深度学习
  • 如何设置PostgreSQL表字段为自增主键
  • 排版工具:也说Markdown的使用方法
  • 分销网站建站wordpress调用推荐文章代码
  • 数据湖Hudi-读取流程可视化
  • 智能环境感知屏幕自适应系统:原理、架构与实现
  • 中卫网站制作公司公司网站seo怎么做
  • Python高效搜索实现:从数据海洋到精准信息的智能导航
  • 安安网站建设优惠的网站快排公司电话
  • Elasticsearch 备份:snapshot 镜像使用篇
  • 10月12日星期天今日早报简报微语报早读
  • 著名建筑网站网站建设市场价
  • MySQL快速构建主从(基于GTID)
  • 感知机:单层,多层(二分类,多分类)
  • 宁波网站建设服务公司电话俄乌局势最新进展
  • python进阶_Day6
  • 网站pv uv统计wordpress 破解主题下载地址
  • 全参数与PEFT深度剖析
  • 记忆翻牌游戏