反转链表 --- 递归回溯算法练习三

news2025/1/17 2:57:12

目录

1. 分析题意

2. 分析算法原理

2.1. 递归思路:

1. 挖掘子问题:

3. 编写代码

3.1. step 1:

3.2. step 2:

3.3. step 3:

3.4. 递归代码:


1. 分析题意

力扣原题链接如下:

206. 反转链表 - 力扣(LeetCode)

题意:给一个单链表的头节点,反转链表,并返回反转之后的头节点。

注意:该链表可能为空表;其次,要返回反转之后的头节点。

2. 分析算法原理

2.1. 递归思路:

如果一个问题可以用递归的方案处理,那么首先我们需要挖掘出重复子问题

该问题的目的:反转单链表,并返回反转后的头节点。例如:

1. 挖掘子问题:

如果我要反转上面的链表,那么我可以先反转下面的链表。反转之后,让 1节点 的next的next域指向1节点,同时将1节点的next域置为nullptr;此时就完成了逆置。

那么上面这个链表依旧可以再分;但我们在这里就不再举例了。我们已经发现,这就是一个重复的子问题。即当节点个数大于1时,我们就需要反转它的next域。如果当节点个数小于1(为空或者是叶子节点)那么就不要再反转了,此时返回它自己即可。

3. 编写代码

3.1. step 1:

步骤一:重复子问题,该过程决定了递归函数函数头的设计。经过我们上面的分析,重复子问题就是反转链表。

// 函数头:
Node* dfs(Node* head);

3.2. step 2:

步骤二:只关心某一个子问题在做什么事情,这个过程决定了函数体的设计。

对于递归代码的编写,我们需要站立在宏观角度看待递归问题,我们一定要相信上面的dfs这个递归函数一定可以达到我们的预期:反转链表,并返回反转之后的头节点。

// 函数体:
// 反转逻辑:
newhead = dfs(head->next);
head->next->next = head;
head->next = nullptr;
// 返回反转后的头节点
return newhead;

举例: 

 

3.3. step 3:

step three:当一个问题不可以在被分为相同子问题的时候,就是递归结束条件;这个过程决定了递归的出口;

那么上面的结束条件就是:当遇到空节点或者叶子节点,那就不需要在反转了,此时只需要返回自身即可。

// 递归的出口
if(!head || (!head->next)) return head;

3.4. 递归代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 遇到空节点 or 遇到了叶子节点,那么就不要在逆置了
        if(!head || !(head->next)) return head;

        // 逆置head->next的链表,并返回该链表的头节点
        ListNode* newhead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        // 返回头节点
        return newhead;
    }
};

如果还不理解:那么就画一下递归展开图吧。 

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

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

相关文章

组件的设计原则

目录 插槽的基本概念 基础用法 具名插槽 使用场景 布局控制 嵌套组件 组件的灵活性 高级用法 作用域插槽 总结 前言 Vue 的 slot 是一项强大的特性,用于组件化开发中。它允许父组件向子组件传递内容,使得组件更加灵活和可复用。通过 slot&…

抢量双11!抖音商城「官方立减」 缘何成为“爆单神器”?

10月20日抖音商城双11好物节正式开跑,仅仅三天,抖音商城整体GMV对比去年同期提升了200%,而在开跑一周后,一些品牌的销售额已经超过了今年整个618,可谓增势迅猛。其中,平台官方特别推出的「官方立减」玩法&a…

抢占全球30%碳化硅市场份额!英飞凌押注低碳化和数字化“新时代”

“未来十年将是低碳化和数字化‘双轮驱动’发展的时代。” 英飞凌科技全球高级副总裁及大中华区总裁、英飞凌科技大中华区电源与传感系统事业部负责人潘大伟在英飞凌2023年大中华区生态创新峰会上表示。 当前,“数字化低碳化”新趋势正在席卷和重塑着未来世界的千行…

vue.cli 中怎样使用自定义的组件

目录 创建自定义组件 注册并使用自定义组件 全局注册自定义组件 使用 Props 传递数据 总结 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用自定义组件的灵活性和简便性。通过Vue CLI,你可以创建、注册和使…

UI自动化测试最佳设计模式POM

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:加入1000人软件测试技术学习交流群📢资源分享:进了字节跳动之后,才…

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时,看到了NI MAX中列出该设备,但却显示了黄色警告指示,并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…

WebSphere Liberty 8.5.5.9 (一)

WebSphere Liberty 8.5.5.9 (一) 安装 1. 从官网下载 WebSphere Liberty 8.5.5.9 2. 解压 解压到 D:\wlp-webProfile7-java8-8.5.5.93. 启动 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>server start 正在启动服务器 defaultServer。 服务器 defaultServer 已启动。4. …

UWB人员定位系统的原理与应用

uwb定位技术源码 uwb高精度定位系统源码 uwb人员定位系统基于什么原理? UWB人员定位系统基于超宽带(Ultra WideBand)技术进行位置定位。它利用超短脉冲信号,通过测量信号的到达时间差和信号强度等信息,实现对目标位置的定位。UWB技术具有高…

Docker安装详细步骤及相关环境安装配置

目录 一、从空白系统中克隆Centos7系统 二、使用xshell连接docker_tigerhhzz虚拟机 ​编辑 三、在CentOS7基础上安装Docker容器 最近自己在虚拟机上搭建一个docker,将项目运行在虚拟机中。 需要提前准备的工具,XShell(远程链接工具),VM(…

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …

C语言数据结构-----链表类型详解及链表练习题

0.前言 之前我讲解了循序表以及单链表,接下来我会在介绍几个不同的链表,并举例相关习题使大家能够更加深入的理解。 前期内容如下: 链接: 顺序表(动态顺序表增删查改的代码实现) 链接: 单链表(无头单向不循环)增删查改的代码实现 链接: [双向…

带你详细了解git的【分支和标签】

🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​​ 🌟在这里,我要推荐给大家我的专栏《git》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,…

使用xlwings实现对excel表中指定列隔行求和

需要对上表中的营业额隔行求和,即橙色背景颜色的求和,无背景颜色的求和。 看了大佬的视频,有两种方法: 1.加辅助列 2.使用判断行的奇偶函数,然后在用sumproduct函数 在此,我使用xlwings对excel表中数据…

来世再不选Java!

危机感 距离上一次找工作面试已经过去快2年了,那时候正值疫情肆虐,虽然还未感受到“寒潮来临”的苗头,但最终还是成功通过了几轮面试,顺利签约。在目前公司待了2年了,在大环境的影响下,没有加薪、没有年终…

经典OJ题:奇偶链表

目录 题目: 示例: 解题思路: 方法一:双链表链接法 图例: 代码演示: 解题效果: 方法二:奇偶指针 图例: 代码演示: 题目: 给定单链表…

vmware开启ipv6

说明 在 ipv4 基础上配置ipv6网络。 分享 大数据博客列表开发记录汇总个人java工具库 项目https://gitee.com/wangzonghui/object-tool 包含json、string、集合、excel、zip压缩、pdf、bytes、http等多种工具,欢迎使用。 vm开启ipv6 设置vmware 打开vmware点击编…

第二章 03Java基础-IDEA相关叙述

文章目录 前言一、IDEA概述二、IDEA下载和安装三、IDEA项目结构介绍四、IDEA的项目和模块操作总结前言 今天我们学习Java基础,IDEA下载以及相关配置和基础使用方法 一、IDEA概述 1.IDEA全称IntelliJ IDEA,是用于Java语言开发的集成工具,是业界公认的目前用于Java程序开发最…

“茶叶销售策略:以‘3人回本大放送’模式引领快速流量裂变“

你是否曾经为茶叶的高品质而烦恼?是否曾经为挑选一款适合自己的茶叶而纠结?现在,有一个销售茶叶的团队,他们家599块钱一盒的茶叶,让你轻松品味高端的滋味。他们在小程序这一个渠道,只用了23天的时间&#x…

MYSQL 慢查询和慢查询日志

在数据库管理中,慢查询是指执行时间较长的 SQL 查询语句。这类查询可能导致系统性能下降,影响用户体验。为了帮助识别和解决这些性能问题,数据库管理系统通常提供了慢查询日志,用于记录执行时间超过一定阈值的查询。本文将深入探讨…

计算机视觉:使用opencv进行直线检测

1 直线检测介绍 在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线。其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术。 1.1 什么是霍夫变换 霍夫变换&#xff08…