Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端最高频的算法题之一:反转链表

前端最高频的算法题之一:反转链表

原创
作者头像
HZFEStudio
修改于 2021-10-03 05:12:45
修改于 2021-10-03 05:12:45
58502
代码可运行
举报
文章被收录于专栏:HZFEStudioHZFEStudio
运行总次数:2
代码可运行

完整高频题库仓库地址:https://github.com/hzfe/awesome-interview

完整高频题库阅读地址:https://febook.hzfe.org/

题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解法一:迭代(双指针)

在线链接

本方法是对链表进行遍历,然后在访问各节点时修改 next 的指向,达到反转链表的目的。

  1. 初始化 cur 和 pre 两个节点,分别指向 head 和 null。
  2. 对链表进行循环,声明 temp 节点用来保存当前节点的下一个节点。
  3. 修改当前节点 cur 的 next 指针指向为 pre 节点。
  4. pre 节点修改为 cur 节点。
  5. cur 节点修改为 temp 节点。
  6. 继续进行处理,直到 cur 节点为 null,返回 pre 节点。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
const reverseList = (head) => {
  let cur = head; // 正向链表的头指针
  let pre = null; // 反向链表的头指针
  while (cur) {
    const temp = cur.next; // 暂存当前节点的后续节点,用于更新正向链表
    cur.next = pre; // 将当前节点指向反向链表,这是一个建立反向链接的过程
    pre = cur; // 更新反向链表的头指针为当前已处理的节点,反向链表的该轮构建完成
    cur = temp; // 将正向链表头指针替换为暂存的节点,正向链表处理完成,开始下一轮处理
  }
  return pre;
};

复杂度分析

  • 时间复杂度 O(N):遍历链表使用线性大小时间。
  • 空间复杂度 O(1):变量 pre 和 cur 使用常数大小额外空间。

解法二:递归

在线链接

当使用递归对链表进行处理时,从链表的第一个节点出发,然后找到最后一个节点,该节点就是反转链表的头结点,然后进行回溯处理。

  1. 初始链表的头结点,head 标识。
  2. 如果 head 为空或者 head.next 为空,返回 head。
  3. 定义 reverseHead 节点,保存反转的链表值。
  4. 每次让 head 下一个节点的 next 指向 head,形成反转。
  5. 递归处理到最后一个节点,返回 reverseHead。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
const reverseList = (head) => {
  // 判断当前节点是否还需要处理
  if (head == null || head.next == null) {
    return head;
  }
  // 递归处理后续节点
  const reverseHead = reverseList(head.next);
  // 局部反转节点
  head.next.next = head;
  head.next = null;
  return reverseHead;
};

复杂度分析:

  • 时间复杂度 O(N):n 是链表的长度,需要对链表的每个节点进行反转操作。
  • 空间复杂度 O(N):n 是链表的长度,空间复杂度主要取决于递归调用的栈空间,最多为 n 层。

参考资料

  1. 剑指 offer

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
206. 反转链表 & 876. 链表的中间结点
翻转链表也是很经典的链表相关题目,属于必须掌握的。需要声明两个指针,分别指向前驱节点和当前节点,而翻转链表的核心就是当前节点的next指向的变化。
chuckQu
2022/08/19
3340
剑指Offer题解 - Day02
解析:我们先正序遍历链表,同时将链表的值存入数组中。直到链表为空则停止遍历。最后将数组进行倒置后返回,则是最终结果。
chuckQu
2022/08/19
2460
反转单链表
这结果简直拉胯,我们来做时间和空间复杂度分析,将链表遍历一遍拆掉入栈,然后再将栈遍历一遍出栈生成链表,时间复杂度大致为O(2n),而为了存储节点借用了一个栈的数据结构空间复杂度为O(n),中间临时变量忽略不计,生成一个新的链表又使用了,空间复杂度为O(2n)。
不作声
2021/01/06
4060
【每日一题】LeetCode——反转链表
爱敲代码的小杨.
2024/05/07
890
【每日一题】LeetCode——反转链表
「LeetCode」206. 反转链表
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:
Maynor
2021/12/07
1430
「LeetCode」206. 反转链表
一文搞懂《链表反转》
翻转链表一直都是热门题目,笔者就在某大型互联网公司的面试题中碰到过这种题目,这种题目很常常见,相对应的变形和扩展也很多,今天我们就来攻克它吧。
lucifer210
2019/09/25
1K0
一文搞懂《链表反转》
【leetcode速通java版】03——移除链表元素,设计链表,反转链表
解法: 还挺简单的,为了对第一个数据归一化操作,定义头指针,不含数据的虚拟头节点。
半旧518
2022/10/26
2120
【leetcode速通java版】03——移除链表元素,设计链表,反转链表
leetcode 206. 反转链表 js实现
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:
蓓蕾心晴
2022/10/30
8550
LeetCode-206-反转链表
利用pre指针指向null,并利用cur指针存储head节点,当cur不为空的时候
benym
2022/07/14
1800
算法(二)双指针/迭代
3,需要熟练掌握String/StringBuffer/StringBuilder。
宇宙无敌暴龙战士之心悦大王
2022/01/10
2880
算法(二)双指针/迭代
图解精选 TOP 面试题 005 | 反转链表之迭代求解
链表反转在面试中非常常见,我也在面试中遇到过这道题。在本篇文章中我们先说说如何用迭代法求解该题。
江不知
2019/12/19
5520
图解精选 TOP 面试题 005 | 反转链表之迭代求解
剑指offer | 面试题18:反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
千羽
2021/12/29
5040
剑指offer | 面试题18:反转链表
两种方法求解链表高频面试题之单链表反转
单链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问单链表反转。 今天我们就一起来看下。
与你一起学算法
2021/03/23
3430
LeetCode-面试题24-反转链表
局部反转,将当前节点的后一个节点保存在temp指针里,改变cur指向前一个位置pre,然后向后移动一位pre和cur
benym
2022/07/14
2070
【LeetCode 热题 100】206. 反转链表
很多初学者会误解输入 head = [1,2,3] 是 Python 列表。其实这是题目的简化表示方式,真正传入 reverseList 函数的是链表结构,如下:
未名编程
2025/05/11
450
代码随想录day02--链表
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
ma布
2024/12/25
630
代码随想录day02--链表
LeetCode每日一题-1:反转链表
链表一般都是用迭代或是递归法来解决,而且一般都是构造双指针、三指针,比如反转链表或是DP动态规划。
墨明棋妙27
2022/09/23
2140
TypeScript算法题实战——链表篇(链表的设计、反转、两两交换、删除、相交和环形链表)
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思),链表的类型有单链表、双链表、循环链表。
中杯可乐多加冰
2024/08/03
2280
206. 反转链表
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
lucifer210
2019/08/19
5330
【数据结构和算法】反转链表
这是力扣的 206 题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的一种。
绿毛龟
2024/01/19
1190
【数据结构和算法】反转链表
相关推荐
206. 反转链表 & 876. 链表的中间结点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验