206. 反转链表

news/2024/9/28 21:29:57

题目链接

一、题目描述

1. 题目

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

2. 示例

示例 1:

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

输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]

输出:[2,1]

示例 3:

输入:head = []

输出:[]

3. 提示

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

二、代码实现

1. 迭代

1.1 解题思路

解决方案是通过维护双指针来进行遍历,通过将当前节点的 next 节点指向一个新的 pre 节点。指针如果改变,后续的值还需要使用时,需要用一个 temp 节点暂存后继节点的值。

图解如下:

代码实现如下:

class Solution {public ListNode reverseList(ListNode head) {// 初始化 cur 和 pre指针,以及 temp 作为暂存后继节点ListNode cur = head;ListNode pre = null;ListNode temp = null;while(cur != null){temp = cur.next;	//暂存后继节点cur.next = pre;		//改变节点指向pre = cur;		//pre 指针后移cur = temp;		//cur 指针后移}return pre;}
}

1.2 复杂度分析

时间复杂度 O(n),其中 n 是链表的长度,需要遍历链表一次。
空间复杂度 O(1),定义的变量使用的常数大小空间。

2. 递归

2.1 解题思路

链表、树、图相关的算法首先想递归。递归相关的知识见我的另一篇文章迭代与递归。

递归设计函数的步骤:

1. 找重复: 找到的相同的子问题。

我们想将链表的节点反转,也就是说要将每个节点的指向反转过来,所以这里的子问题就是,调整每个节点的指向。

2. 找变化: 聚焦于某一个子问题,查看变化的量,通常会作为参数,这时可定义函数体;

如图,针对最后两个节点,变化的量只有 cur 指针,代表着层层遍历的节点。这里的递归函数入参就是当前节点的后继节点。

定义函数体:

private ListNode recursion(ListNode cur){//递归调用后继节点recursion(cur.next);
}

3. 找出口: 也就是找终止条件,这里注意关注返回值。

找终止条件首先关注返回值,这里的返回值我们如何定义呢?因为这里的链表是单向的,也就是无法获取节点对应的前驱节点。

所以我们需要再递归的归中操作节点指向的反转,这样就可以得到返回值,必须是返回当前的节点,再上一层进行节点指向反转。

那什么时候才终止递归呢?当前节点为 null 时,则没必要再进行反转。还有一个情况时当前节点的后继节点为 null 时,由于我们递归函数的入参就是当前节点的后继节点,故也没必要再次递归,直接返回当前节点即可。

最终代码示例:

private ListNode recursion(ListNode cur){if(cur == null || cur.next == null){return cur;}//递归调用后继节点ListNode result = recursion(cur.next);//后继节点指向当前节点cur.next.next = cur;//切断当前节点的后继节点,防止链表产生环形cur.next = null;return result;
}

2.2 复杂度分析

时间复杂度 O(n),其中 n 是链表的长度,每个节点都需要进行反转处理。
空间复杂度 O(n),其中 n 是链表的长度,递归深度占用的栈内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45636.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

openpyxl 创建 execl 并设置密码

代码示例 from openpyxl import Workbook# 创建一个新的 Excel 文件 workbook = Workbook() sheet = workbook.active# 添加一些示例数据到 Excel data = [["Name", "Age"],["Alice", 30],["Bob", 25],["Charlie", 35] ]for…

【长文】带你搞明白Redis

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过…

智慧大屏赋能掘进机:地下工程的新“眼睛”与“大脑”

掘进机装备智慧大屏是先进技术与传统掘进机的完美结合。它集成了高清显示、大数据分析、云计算等尖端技术,将掘进机的各项数据实时展示在屏幕上,让操作人员一目了然。无论是掘进速度、土壤硬度、机械磨损,还是油压、水温等关键指标,都能在这里得到精准反馈。在地下工程的浩…

WPF/C#:在DataGrid中显示选择框

本文介绍了WPF/C#如何在DataGrid中显示选择框。前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的。 整体实现效果如下:如果对此感兴趣,可以接下来看具体实现部分。 实践 假设数据库中的模…

Windows中在commond如何设置系统环境变量

最近测试项目中需要配置一个python环境用来发work job,配置过程中有一个步骤需要增加系统变量: add two system env vars for the test application by different environments (dev/stg/prod):FORGE_TEST_CLIENT_IDFORGE_TEST_CLIENT_SECRET处理方法: 1、查看已经设置了哪些…

Barrier 的安装和配置

背景 目前在使用的是 Ubuntu + Win 的两套主机,日常开发主要是 Ubunut,但部分工作不得不用到 Win,所以通过一套键鼠来控制两台主机的需求(KVM)就很强烈了。 关于具体的 KVM 方案选择过程,可以点击方案评估来选择具体的方案,本篇文章主要是给那些决定使用 Barrier 的同学…

什么是AST?AST有什么用?

在写之前,先回答一下标题。什么是AST呢? 在编程和软件工程中,AST 是抽象语法树(Abstract Syntax Tree)的缩写。它是一种用于源代码的抽象语法结构的树状表现形式,以树状的形式表示源代码的语法结构。AST有什么用呢? 对于反爬工程师来说,他们可以利用AST把他们写好的Jav…

IDEA中ctrl+F12快捷键失效

IDEA项目的一个类中使用Ctrl+F12想查看类中方法当你的才华配不上你的野心,努力的时候到了!