【算法】笔记:LeetCode 206. 反转链表

news2025/1/17 6:09:30

文章目录

    • 前言
    • 思考问题:把分开的节点连在一起
    • 结合原题:使用[迭代]解决卡点
      • 引入新指针
      • 边界条件
        • 代码
      • 反转的逻辑
        • 代码(完整答案)
    • 结合原题:使用[递归]解决卡点
      • 完整代码
      • 问题的子问题
      • 当前层要干什么
      • 递归出口

前言

这道题可以拆成几个小点去理解,本篇博文快速记录一下。有迭代和递归两种解法。迭代的解法空间复杂度更优秀,递归的思想更巧妙。这里主要总结下迭代的解法。并简要理解下递归的解法。

  • LeetCode 206. 反转链表

思考问题:把分开的节点连在一起

  • 以下是分开的节点(假定以下四个节点都能以数组的形式按序访问)
    在这里插入图片描述
  • 一个指针遍历既可以连在一起
    在这里插入图片描述在这里插入图片描述
  • 最终的结果
    在这里插入图片描述

结合原题:使用[迭代]解决卡点

题目用链表组织原始节点,也就是四个节点只能使用向后遍历的方式按序访问。
在这里插入图片描述

  • cur指针可以从头遍历到尾,结合上文尝试用一个指针去完成需求,会遇到难题
    在这里插入图片描述

引入新指针

新指针的使命是:在原始链表中记住cur 的下一个节点,在指针断裂后,依旧能让cur继续遍历。

在这里插入图片描述

  • 根据官方题解,把指针的名字改一下(思想是统一的)
    在这里插入图片描述

边界条件

  • 开始
    在这里插入图片描述

  • 结尾
    在这里插入图片描述

代码

	public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            // 暂时忽略链表反转的逻辑
            cur = cur.next; // 这句后续要改造
        }
        return pre;
  	}

反转的逻辑

  • 结果:加入第一个节点(第一个要加入的是NULL),下一轮开始加入cur指向的节点
    在这里插入图片描述

代码(完整答案)

	public ListNode reverseList(ListNode head) {
		if (head == null) {
            return head;
        }
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            // 1. 记住cur的下一个节点, 避免指针断裂后找不到后续元素
            ListNode next = cur.next;
            // 2. cur 指针指向pre,同时断开原链表的方向
            cur.next = pre;
            // 3. pre 这一轮的使命完成了, 下一轮要处理的pre就是当前的cur所指向的元素
            pre = cur;
            // 4. 同理, 下一轮要处理的cur就是刚刚保留起来防止找不到的节点 next
            cur = next;
        }
        return pre;
  	}

结合原题:使用[递归]解决卡点

递归掌握的还是不够好,参考人家的题解,以后加以复习
参考leetCode的题解的图去观察回溯的过程

思考三个问题

  • 这个问题的子问题是什么。
  • 当前层要干什么事情。
  • 递归出口。

完整代码

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;
    }
}

问题的子问题

node1 -> node2 -> node3 -> node4 反转整个链表可以视为以下过程的组合:

  • 1 ~ 3 节点 与 4 节点 反转: node1 -> node2 -> node3 ->[node4]

  • 1 ~ 2 节点 与 3 节点 反转:node1 -> node2 -> [node3 <- node4]

  • 1 节点 与 2 节点的反转: node1 -> [node2 <- node3 <- node4]

完成后: [node1 <- node2 <- node3 <- node4]

	
    public ListNode reverseList(ListNode head) {
        // 这个模型, 就是让程序递归到最深处的节点(遇到最后一个节点node4,再回到node3), 此时 head 为 node3
        ListNode newHead = reverseList(head.next);
        // 从 node4 回溯到 node1, 以下代码就是当前层要处理的问题
        head.next.next = head;
        head.next = null;
        return newHead;
    }

当前层要干什么

		// head.next 就是 node4, head 就是node3
        head.next.next = head;
        head.next = null;

在这里插入图片描述

在这里插入图片描述

递归出口

		if (head == null || head.next == null) {
            return head;
        }

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

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

相关文章

冰箱压缩机 方案

压缩机是制冷系统的心脏&#xff0c;它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为制冷循环提供动力&#xff0c;从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…

C#开发的OpenRA的游戏主界面怎么样创建

通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存, 但是这些数据怎么显示出来,又是没有定义的。比如前面定义了多个界面的布局, 又是怎么样知道需要显示哪一个界面? 现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的, 所以我们需要从yaml…

水果FLStudio21.0.0中文版全能数字音乐工作站DAW

FL Studio 21.0.0官方中文版重磅发布纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01;Mac版新增对苹果M2/1家族芯片原生支持。编曲、剪辑、录音、混音&#xff0c;20余年的技术积淀和实力研发&#xff0c;FL Studio 已经从电音…

【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

文章目录前言移除链表元素相交链表写在最后前言 本章的OJ练习也是相对简单的&#xff0c;只要能够理解解题的思路&#xff0c;并且依照这个思路能够快速的写出代码&#xff0c;我相信&#xff0c;你的链表水平已经足够了。 对于OJ练习&#xff08;2&#xff09; : ->传送门…

不平凡的一天——

作者&#xff1a;指针不指南吗 专栏&#xff1a;个人日常记录 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.自我介绍2.上学期3.不凡的一天4.新学期写个博客&#xff0c;简单记录一下&#xff0c;新学期加油&#xff01;&#xff01;&#xff…

day7 同步互斥

作业 1.将一个文件中的数据打印到终端上类似cat一个文件&#xff0c;要求如下 &#xff08;1&#xff09;a线程读取文件中的数据 &#xff08;2&#xff09;B线程将A线程读取到的数据打印到终端上 &#xff08;3&#xff09;文件打印完毕后&#xff0c;结束进程 方法1&#…

CMMI流程规范—服务与维护

服务与维护&#xff08;Service and Maintenance, SM&#xff09;是指产品销售之后的客户服务和产品维护。客户服务和产品维护的宗旨就是提高客户对产品以及对开发方的满意度。服务与维护过程域是SPP模型的重要组成部分。本规范阐述了服务与维护过程域的两个主要规程&#xff1…

蓝库云|五大关键引领制造业数字化智慧升级

蓝库云根据《2023制造产业趋势展望》报告&#xff0c;并归纳出「强化企业韧性与敏捷、提升留才诱因、建构多元供应链、兼顾安全的智慧工厂、循环催化永续经营」是牵动制造产业发展的五大关键。将永续目标整合至企业中长期策略中&#xff1b;数字化方面则搭配五大发展关键&#…

【Redis应用】基于Redis实现共享session登录(一)

&#x1f697;Redis应用学习第一站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 &#x1f449;相关推荐&#xff1a;使用短信服务发送手机验证码进行安全校验 一.引入 ​ 在开发项目过程中&#xff0c;我们常常能碰到需要登录注…

Linux操作系统学习(文件IO)

文章目录基础IO系统相关接口文件描述符一切皆文件文件描述符的分配规则重定向fork后的文件描述符基础IO 系统相关接口 在C语言中对文件的操作有fopen打开、fclose关闭、fread读、fwrite写等函数&#xff1b;其实这些都是在系统调用接口上进行的封装。 这里介绍4个系统调用接…

【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null

一、报错内容 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column tenant_id cannot be null ### The error may exist in com/xxx/cloud/mall/admin/mapper/Goods…

303. 区域和检索 - 数组不可变

303. 区域和检索 - 数组不可变 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a; NumArray(int[] num…

英语六级的三大经典句型

目录 1.强调句型&#xff08;提前想好要写在哪个地方&#xff09; 2.虚拟语气 3.第三个句型 3.倒装&#xff08;写一到两个倒装&#xff09; &#xff08;1&#xff09;否定词放在句首就是倒装 &#xff08;2&#xff09;so...that句型结构的句子将so引导的部分置于句首时…

一、一篇文章打好高数基础-函数

1.连续函数的性质考点分析函数的连续性主要考察函数的奇偶性、有界性、单调性、周期性。例题判断函数的奇偶性的有界区间为&#xff08;&#xff09; A.(-1,0) B(0,1) C(1,2) D(2,3)2.闭区间上连续函数的性质考点分析闭区间上连续函数的性质主要考察函数的最大最小值定理、零点…

JavaScript 函数参数

JavaScript 函数对参数的值(arguments)没有进行任何的检查。JavaScript 函数参数与大多数其他语言的函数参数的区别在于&#xff1a;它不会关注有多少个参数被传递&#xff0c;不关注传递的参数的数据类型。函数显式参数与隐藏参数(arguments)在先前的教程中&#xff0c;我们已…

删除启动台(LaunchPad)残留的图标

忘记什么版本的时候以前在 “应用程序” 删除应用后&#xff0c;启动台自动更新删掉 不知道什么时候开始&#xff0c;直接在 “应用程序” 里删掉后&#xff0c;启动台居然不能删除了…… 10.13和10.14后&#xff0c;无论是按住 Option&#xff0c;还是按住 Control Option …

Fisco-Bcos的环境搭建及Data-Export导出组件的使用

注意&#xff1a;由于Data-Export组件暂时只支持Fisco-Bcos 2.x系列&#xff08;这个也是目前使用最多最稳定的系列&#xff09;&#xff0c;故这里使用的是目前最新的Fisco-Bcos 2.x。 Fisco-Bcos链环境搭建 区块链网络部署 主要一步步按照这个官方的操作即可区块链网络搭建…

飞桨paddlespech 语音唤醒初探

PaddleSpeech提供了MDTC模型&#xff08;paper: The NPU System for the 2020 Personalized Voice Trigger Challenge&#xff09;在Hey Snips数据集上的语音唤醒(KWS)的实现。这篇论文是用空洞时间卷积网络&#xff08;dilated temporal convolution network, DTCN&#xff09…

Java 类和对象简介

类是对象的抽象&#xff0c;是一组具有相同特性&#xff08;属性&#xff0c;事物的状态信息&#xff09;和行为&#xff08;事物能做什么&#xff09;的事物的集合&#xff0c;可以看做一类事物的模板。 对象是类的实例化&#xff0c;是具体的事物。 比如&#xff1a;人类和…

linux基本功之列之wget命令实战

文章目录前言一. wget命令介绍二. 语法格式及常用选项三. 参考案例3.1 下载单个文件3.2 使用wget -o 下载文件并改名3.3 -c 参数&#xff0c;下载断开链接时&#xff0c;可以恢复下载3.4 wget后台下载3.5 使用wget下载整个网站四. 补充与汇总常见用法总结前言 大家好&#xff…