每日一练:LeeCode-LCR 123. 图书整理 I (反转链表)(简)【栈、头插法(虚拟头结点)、双指针、递归】

本文是力扣LeeCode-LCR 123. 图书整理 I (简) 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。

示例 1:
输入:head = [3,6,4,1]
输出:[1,4,6,3]

提示:
0 <= 链表长度 <= 10000

很明显这道题的意思就是反转链表,笔者在这总结了4种方法,供大家参考。
这道题可以使用栈、头插法、双指针、递归等方法,推荐使用头插法

头插法(虚拟头结点)

使⽤虚拟头结点,通过头插法实现链表的反转(不需要栈),建议画图模拟一下

class Solution {
    public int[] reverseBookList(ListNode head) {
        if(head==null)return new int[]{};
        if(head.next==null)return new int[]{head.val};
        ListNode dummy = new ListNode(-1);	 创建虚头结点
        dummy.next = null;

        ListNode cur = head;
        int count = 0;
        // 遍历所有节点
        while(cur!=null){
            ListNode temp = cur.next;	//保存cur的下一节点,迭代使用
            // 头插法
            cur.next = dummy.next;	
            dummy.next = cur;
            cur = temp;
            count++;
        }
        //满足题意,主要流程为上面
        int[] res = new int[count];
        for(int i=0;i<count;i++){
            res[i] = dummy.next.val;
            dummy=dummy.next;
        }
        return res;
    }
}

时间复杂度: O(n)
空间复杂度: O(1)

栈方法

  • ⾸先将所有的结点⼊栈
  • 然后创建⼀个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来⼀个元素,就把它加⼊到以虚拟头结点为头结点的链表当中,最后返回即可
class Solution {
    public int[] reverseBookList(ListNode head) {
        if(head==null)return new int[]{}; //如果链表为空,返回空数组
        if(head.next==null)return new int[]{head.val}; //如果链表中只有⼀个元素,则直接返回该元素数组
        Stack<ListNode> stack = new Stack<>();	 创建栈 每⼀个结点都⼊栈
        ListNode cur = head;
        while(cur!=null){
            stack.push(cur);
            cur = cur.next;
        }

		// 创建⼀个虚拟头结点
        ListNode dummy = new ListNode(0);
        cur = dummy;	//指针传递
        int size = stack.size();
        while(!stack.isEmpty()){
            ListNode node = stack.pop();
            cur.next = node;
            cur = cur.next;
        }
        cur.next = null;	//最后⼀个元素的next=null,否则成环了

		//满足题意,主要流程为上面
        int[] res = new int[size];
        for(int i=0;i<size;i++){
            res[i] = dummy.next.val;
            dummy=dummy.next;
        }
        return res;
    }
}

双指针法

class Solution {
    public int[] reverseBookList(ListNode head) {
        if(head==null)return new int[]{};
        if(head.next==null)return new int[]{head.val};
        ListNode cur = head;
        ListNode pre = new ListNode(0);
        pre = null;
        int count = 0;
        while(cur!=null){
            ListNode temp = cur.next;	// 保存⼀下 cur的下⼀个节点,因为接下来要改变cur->next
            cur.next = pre;	// 翻转操作
			// 更新pre和cur,准备作下一次循环
            pre = cur;
            cur = temp;

            count++;
        }
        //满足题意,主要流程为上面
        int[] res = new int[count];
        for(int i=0;i<count;i++){
            res[i] = pre.val;
            pre=pre.next;
        }
        return res;
    }
}

时间复杂度: O(n)
空间复杂度: O(1)

递归

这种方法和双指针异曲同工,有了双指针的理解,这种方法,可以直接写出来

class Solution {
    private static int count = 0;
    public int[] reverseBookList(ListNode head) {
        if(head==null)return new int[]{};
        if(head.next==null)return new int[]{head.val};

        ListNode pre = reverse(null,head);
        int[] res = new int[count];
        for(int i=0;i<count;i++){
            res[i] = pre.val;
            pre=pre.next;
        }
        return res;
    }

    private ListNode reverse(ListNode pre,ListNode cur){
        if(cur==null)return pre;
        ListNode temp = cur.next;
        cur.next = pre;
        count++;
		// 递归的写法,其实就是做了双指针法这两步
		// pre = cur;
		// cur = temp;
        return reverse(cur,temp);
    }
}

这种方法,笔者还没通过提交,但是单独测试报错的例子,也可以通过,有点百思不得其解,望大佬指出问题。
在这里插入图片描述

时间复杂度: O(n), 要递归处理链表的每个节点
空间复杂度: O(n), 递归调⽤了 n 层栈空间

大家有更好的方法,请不吝赐教。

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

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

相关文章

漏洞扫描工具scan4all(15000+PoC)

scan4all拥有15000PoC漏洞扫描&#xff0c;23种应用弱口令爆破&#xff0c;7000Web指纹&#xff0c;146种协议&#xff0c;90000规则Port扫描。集成 vscan、nuclei、ksubdomain、subfinder等&#xff0c;充分自动化进行扫描。是一款Fuzz、HW打点、BugBounty神器等工具。 项目地…

Python入门第09篇(conda虚拟环境)

前言 一开始默认安装了最新的Python3.12&#xff0c;搞的倒也顺手&#xff0c;看别人会有不兼容的问题&#xff0c;在我这开始没出现。不过坑总会踩到的&#xff0c;这不就出问题了。pip install一个包一直不行&#xff0c;问了下度娘&#xff0c;说由于这个包使用了一些新技术…

caj转换成pdf有哪些方法?

caj转换成pdf有哪些方法&#xff1f;PDF是一个被广泛支持的文件格式&#xff0c;这种格式基本上在所有的操作系统和设备上都是支持使用的&#xff0c;也能够将PDF文件打开和查看的&#xff0c;相比于caj文件&#xff0c;它就只能通过一下特定的软件或者是插件才能够将caj打开或…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐&#xff0c;再见2023&#xff0c;加油2024&#xff0c;未来可期&#xff0c;愿新的一年带来健康、幸福和成功&#xff01;&#x1f4aa; &#x1f4aa;&#x1f4aa; 多种设备之间能够实现硬件互助、资源共享&#xff0c;依赖的关键技术包括分布式软总线、分布式设备虚…

如何调用FastGPT的API

fastGPT提供兼容OpenAI格式的接口&#xff0c;但是还是有一些地方需要注意 新建一个应用&#xff0c;可以正常测试通过后。【外部使用】【API访问】【新建一个KEY】 我们在调用FastGPT API的时候&#xff0c;需要传递一个chatId的参数&#xff0c;这个是标识同一个会话的参数…

SpringBoot+SSM项目实战 苍穹外卖(08) 用户下单支付订单 内网穿透cpolar软件 绕开微信支付实现

继续上一节的内容&#xff0c;本节导入地址簿功能代码&#xff0c;并实现用户下单和订单支付功能。 这里写目录标题 导入地址簿功能代码接口分析代码实现 用户下单接口分析代码实现 订单支付内网穿透——cpolar软件代码导入绕开微信支付实现 导入地址簿功能代码 地址簿&#x…

注册 Mongodb 官网个人账号

上文 Mongodb基础介绍与应用场景我们简单说了一下 Mongodb 的场景 那么 我们先在他的官网创建一个个人账号 我们先访问官网 https://www.mongodb.com/zh-cn 这里 我们需要注册一下 这里 我们按要求填写信息 然后 点击下面创建账户 然后 点击下面创建账户 然后 他会要求我们邮…

OSCHINA Gitee 联合呈现,《2023 中国开源开发者报告》正式发布,总结分非常帮,可以免费看的报告!

《2023 中国开源开发者报告》 详细地址&#xff1a; https://talk.gitee.com/report/china-open-source-2023-annual-report.pdf 不需要收费下载&#xff01;&#xff01; 其中大模型的部分总结的非常棒 gietee 也支持 AI 模型托管了 如何在 Gitee 上托管 AI 模型 https://…

嵌入式视频播放器(mplayer)

1.文件准备&#xff1a; MPlayer-1.0rc2.tar.bz2 libmad-0.15.1b.tar.gz 直接Git到本地 git clone https://gitee.com/zxz_FINE/mplayer_tarball.git 2.文件夹准备&#xff1a; src存放解压后的源码文件&#xff0c;target_Mplayer存放编译安装的目标文件 mkdir src targe…

Ethercat“APWR配置从站地址”报文分析(0x0010:0x0011)

基于IgH主站接了3个从站&#xff0c;分析报文。 APWR&#xff1a;Auto Increment Physical Write。 一条Ethercat报文中可以包含多个子报文&#xff0c;每个子报文的地址由ADPADO组成&#xff0c;ADP即16 bit High Addr&#xff0c;ADO即16 bit Low Addr。APWR模式下&#xff…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录&#xff0c;本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

Graceful Response 构建 Spring Boot 下优雅的响应处理

一、Graceful Response Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器&#xff0c;提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能&#xff0c;使用Graceful Response进行web接口开发不仅可以节省大量的时间&#xff0c;还可以提高代码质…

MySQL 高级SQL语句与存储过程

MySQL 高级(进阶) SQL 语句 实验环境以下两表&#xff1a; use kgc; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angele…

ORACLE Primavera P6, Unifier v23.12 系统分享

引言 根据上周的计划&#xff0c;我近日简单制作了一个基于ORACLE Primavera P6 EPPM 以及Unifier 最新版23.12的虚拟机演示环境&#xff0c;里面包括了p6 和 unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机&#xff0c;请您…

Git开发工具基本使用

文章目录 前言Git仓库基本概念基本环境安装清除原先配置生成秘钥配置Host添加公钥Github添加Gitee添加测试 本地仓库基本概览查看提交日志(log)版本回退添加文件至忽略列表分支分支冲突 远程仓库推送到远程仓库从远程仓库中抓取和拉取 在Idea中使用Git总结 前言 这里只是对Git…

仓储9代巷道灯接口文档-V2.0

标签注册 仓储9代巷道灯注册 磁体靠近条码所在区域附近&#xff0c;触发巷道灯注册到系统 注册成功&#xff1a;闪红灯变绿灯常亮&#xff0c;之后熄灭 查询巷道灯信息接口 接口地址&#xff1a;192.168.1.200/wms/associate/queryIndicates 请求类型&#xff1a;applicat…

【DevOps】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

堆排序(C语言版)

一.堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序 1.1.利用上下调整法实现堆排序 第一步&#xff1a;建堆 好了&#xff0c;每次建堆都要问自己…

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具&#xff0c;它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求&#xff0c;如HTTP、HTTPS、FTP、SOAP、REST等&#xff0c;并且可以模拟多种负载类型&#xff0c;例如并发用户、线程组、定时…
最新文章