LeetCode刷题:反转链表

leetCode真题

206. 反转链表

属于基础简单题目

常见的做法有递归和while循环
在这里插入图片描述

递归

    // 1. 递归参数和返回值public static ListNode reverseList(ListNode head) {// 1. 递归终止条件if (head == null || head.next == null) {return head;}// 递归逻辑ListNode last = reverseList(head.next);// last是未反转链表的最后一个节点head.next.next = head;// head和last构成双向head.next = null;// head的向last的指向取消return last;}

不要用自己的大脑想象递归过程,人的大脑记不住几个栈!

这段代码我们要分析其中的实现逻辑

  1. 我们要反转整个链表(head节点),就要先反转链表的子链表(head.next),然后将head修改到整个链表的第一个位置(head.next.next = head;head.next = null;)

  2. 而要反转子链表head.next,就需要反转head.next的子链表,也就是head.next.next

  3. ……直到head.next为null时,此时整个子链表只有一个节点(节点5),单独的一个节点显然已经完成了反转,此时直接return返回,return返回之后,head指向4节点,last指向5节点在这里插入图片描述在这里插入图片描述

  4. 然后是反转倒数第二个节点(4),4节点的子链表显然已经完成了反转,此时只要将4节点拼接到5节点之后即可完成4,5节点的反转
    head.next.next = head;
    在这里插入图片描述

head.next = null;
在这里插入图片描述

return last;
在这里插入图片描述

  1. head指向3节点,重复第四步,直到最后整个链表完成反转

测试demo

ListNode类

public class ListNode {public int val;public ListNode next;public ListNode() {}public ListNode(int val) {this.val = val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}public void loop(ListNode head) {while (head != null) {System.out.print(head.val + "  ");head = head.next;}}
}

反转实现

public class ListTest {public static void main(String[] args) {ListNode _5 = new ListNode(5);ListNode _4 = new ListNode(4, _5);ListNode _3 = new ListNode(3, _4);ListNode _2 = new ListNode(2, _3);ListNode head = new ListNode(1, _2);System.out.print("====反转前:");head.loop(head);System.out.println();head = reverseList1(head);System.out.print("====反转后:");head.loop(head);System.out.println();}// 1. 递归参数和返回值public static ListNode reverseList1(ListNode head) {// 1. 递归终止条件if (head == null || head.next == null) {return head;}// 递归逻辑ListNode last = reverseList1(head.next);// last是未反转链表的最后一个节点head.next.next = head;// head和last构成双向head.next = null;// head的向last的指向取消return last;}
}

在这里插入图片描述

while循环

使用递归的好处是,代码简洁,但是当链表数量特别大的时候,递归可能会引起java的虚拟机栈栈溢出

我们提出了第二种方法,就是while循环

	public static ListNode reverseList2(ListNode head) {// head节点拷贝,pre和later节点用于暂存cur节点的前节点和后节点ListNode pre = null, cur = head, later = null;while (cur != null) {// cur节点代表了要反转的节点,cur节点为null说明所有节点反转完毕later = cur.next;// 1. later节点指向下一节点cur.next = pre;// 2. cur节点的next节点指向pre节点pre = cur;// 3. pre节点指向cur节点cur = later;// 4. cur节点指向later节点}return pre;}
  1. ListNode pre = null, cur = head, temp;
    head节点拷贝,pre和later节点用于后续暂存cur节点的前节点和后节点

  2. while (cur != null) {}

cur节点代表了要反转的节点,cur节点为null说明所有节点反转完毕
在这里插入图片描述

  1. later = cur.next;
    记录cur节点的后节点later

在这里插入图片描述

  1. cur.next = pre;(最核心的一步)

有人此时会说了,pre不是null吗,为什么不能直接cur.next = null;呢?

这行代码的真正含义是新增一条反向的路径,只是第一个节点反转的时候pre恰好为null

在这里插入图片描述

  1. pre = cur;
    记录要反转的节点的上一个节点
    在这里插入图片描述

  2. cur = temp;
    相当于cur = cur.next,cur节点遍历到下一个节点位置

在这里插入图片描述

  1. 重复上述6步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    反转节点3
    在这里插入图片描述

测试demo

同上

总结

递归的代码逻辑清晰,但是消耗内存会比较多,而且可能会栈溢出;
while循环不会栈溢出;

两者的时间复杂度都是O(n)级别的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库相关SQL及适配Mysql配置总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Windows 系统安装 VisualSVN Server

一.下载 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服务器端要使用的软件,就是我们提交代码存在安装这个软件的电脑上,它将很多配置和服务直接帮你完成,简单好用容易上手。VisualSVN Server有三个版本,社区版免费但限15个用户,另有一般和‘企业’两个收费版本…

如何卸载ollama

文章目录 一 概述二 卸载2.1 Windows平台卸载 ollama2.2 Linux 平台卸载 ollama2.3 Docker 平台卸载 ollama 参考链接 一 概述 本文档主要讲述 ollama 如何卸载,适用范围包括 Windows Linux 以及 Docker 等平台的安装方式。 二 卸载 2.1 Windows平台卸载 ollama …

学习C++应该做点什么项目

C作为一门底层可操作性很强的语言,广泛应用于游戏开发、工业和追求性能、速度的应用。 比如腾讯,无论游戏,还是微信,整个鹅厂后台几乎都是 C 开发,对 C 开发者的需求非常大。 但问题是C入门和精通都比较困难&#xf…

有哪些挣钱软件一天能赚几十元?盘点十个能长期做下去的挣钱软件

在这个信息爆炸的时代,每个人都在寻找快速赚钱的秘诀。很多人做兼职副业的目标并不是获得很大的成功,大部分人一天能赚几十就心满意足了。 今天,我要带你一探究竟,揭秘那些能让你日赚几十元的挣钱软件。准备好了吗?让我…

单枪匹马月入17万美元:数字游民Pieter Levels如何成就商业传奇

了解数字游民的应该都听说过 Pieter Levels,可以说他是数字游民的先驱人物。 他在推特上拥有超过43万的粉丝,仅凭一台笔记本电脑就连续建立了多个高盈利网站,光是推特主页上展示的比较新的几个网站,每月收入加起来就高达 17.6 万…

Vulnhub项目:THE PLANETS: MERCURY

1、靶场地址 The Planets: Mercury ~ VulnHubThe Planets: Mercury, made by SirFlash. Download & walkthrough links are available.https://vulnhub.com/entry/the-planets-mercury,544/ 这好像是个系列的,关于星球系列,之前还做过一个地球的&a…

STM32-15-DMA

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD 文章目录 STM…

[原创][Delphi多线程]TThreadedQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

解读信创产业根基,操作系统发展历程

信创产业根基之一操作系统 操作系统是一个关键的控制程序,负责协调、管理和控制计算机硬件和软件资源。作为硬件的首要软件扩展,它位于裸机与用户之间,充当了两者之间的桥梁。通过其核心程序,操作系统高效地管理着系统中的各类资源…

有哪些兼职软件一天能赚几十元?盘点十个能长期做下去的挣钱软件

在当今这个信息泛滥的时代,众人纷纷寻求迅速致富的捷径。许多人在从事兼职或副业时,并不期望取得巨大的成就,只要每天能额外收入数十元,便已心满意足。 今天,我将带领大家深入探究,揭开那些隐藏在日常生活…

【小海实习日记】Git使用规范

1.Git使用流程 1.1 从master分支拉一个分支,命名要符合规范且清晰。 1.2 commit到本地,push 到远端。 1.3 在Gitlab创建MR,选择develp分支。 1.4 如果要修改的话,先把Gitlab上的MR修改为Draft(修改态),然后在本地修改代…

9.1.1 简述目标检测领域中的单阶段模型和两阶段模型的性能差异及其原因

9.1目标检测 场景描述 目标检测(Object Detection)任务是计算机视觉中极为重要的基础问题,也是解决实例分割(Instance Segmentation)、场景理解(Scene Understanding)、目标跟踪(Ob…

subline text3安装numpy,scipy,matplotlib,pandas,sklearn,ipynb

1,numpy(基础数值算法) 安装,要是在cmd直接安装到最后会报错, import numpy as np ModuleNotFoundError: No module named numpy 直接进入python环境,输入python -m pip install numpy就不会报错…

云端数据提取:安全、高效地利用无限资源

在当今的大数据时代,企业和组织越来越依赖于云平台存储和处理海量数据。然而,随着数据的指数级增长,数据的安全性和高效的数据处理成为了企业最为关心的议题之一。本文将探讨云端数据安全的重要性,并提出一套既高效又安全的数据提…

浅测 长亭雷池 WAF “动态防护”

本文首发于 Anyeの小站 前言 雷池 WAF 社区版的更新速度是真快啊,几乎一周一个小版本,俩月一个大版本,攻城狮们真的狠啊,没法测了。 废话不多说,前两天看到了 这篇文章,对雷池的“动态防护”功能挺感兴趣…

去掉el-table表头右侧类名是gutter,width=17px的空白区域(包括表头样式及表格奇偶行样式和表格自动滚动)

代码如下&#xff1a; <el-table:data"tableData"ref"scroll_Table":header-cell-style"getRowClass":cell-style"styleBack"height"350px"style"width: 100%"><el-table-column prop"id" l…

Scrum团队在迭代中如何处理计划外的工作

认为 Scrum 团队不做计划其实是一个误区&#xff0c;实际上很多 Scrum 团队在冲刺计划会议以及在细化工作项时均会进行详细规划。此外&#xff0c;他们还会创建一个路线图&#xff0c;以便显示他们在多个冲刺中的计划。 Scrum 团队需要经常进行计划&#xff0c;以便在不断变化…

混合动力电动汽车介绍(二)

接续前一章内容&#xff0c;本篇文章介绍混合动力汽车串联、并联和混联的系统组成和工作原理。 一、串联混合动力电动汽车的系统组成和工作原理 上图为串联混合动力电动汽车的结构简图。汽车由电动机-发电机驱动行驶&#xff0c;电机控制器的动力来自油箱-发动机-发电机-发电机…

基于Spring Boot框架的分页查询和文件上传

分页查询 分析 要想从数据库中进行分页查询&#xff0c;我们要使用LIMIT关键字&#xff0c;格式为&#xff1a;limit 开始索引 每页显示的条数 假设一页想展示10条数据 查询第1页数据的SQL语句是&#xff1a; select * from emp limit 0,10; 查询第2页数据的SQL语句是&…