两两交换链表中的节点 --- 递归回溯算法练习四

目录

1. 分析题意

2. 分析算法原理

2.1. 递归思路:

1. 挖掘子问题

3. 编写代码

3.1. step 1:

3.2. step 2:

3.3. step 3:

3.4. 递归代码


1. 分析题意

力扣上原题链接如下:

24. 两两交换链表中的节点 - 力扣(LeetCode) 

给一个单链表,让我们两两交换相邻的节点,并返回交换后链表的头节点。

注意:不可以修改原节点内部的val,只能进行节点交换。

2. 分析算法原理

2.1. 递归思路:

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

上面的问题的目的,两两进行交换相邻的节点,并返回交换后的头节点。例如:

1. 挖掘子问题

如果我要进行两两交换相邻的节点,那么我们可以先把 1,2看成一个整体,此时我们就需要先进行交换3,4,这两个相邻的节点。例如:

同理,如果3、4这两个节点后面还有两个以上的节点,那么就继续把3、4看成一个整体,重复上述操作。但如果后面的节点个数为1或0,那么就停止交换,并返回自身即可,例如上面,此时只有5这个节点,返回5这个节点即可。 

此时我们就发现了重复的子问题:当后面的节点个数大于2时,就两两交换相邻的节点,并返回交换后的头节点。

3. 编写代码

3.1. step 1:

步骤一:重复子问题,该过程决定了递归函数函数头的设计。经过我们上面的分析,重复子问题就是两两交换相邻的节点。

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

3.2. step 2:

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

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

// 函数体:
// 交换逻辑
tmp = dfs(node->next->next);
node->next->next = node;
ret = node->next;   // 保存交换后的头节点
node->next = tmp;
// 返回交换后的头节点
return ret;

3.3. step 3:

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

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

if( !node || !(node->next)) return node;

3.4. 递归代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        // 遇到空节点 or 遇到了叶子节点,那么就不要在交换了
        if(!head || !(head->next))  return head;
        // 交换head->next->next 和 head->next->next->next这两个节点
        // 并 return 交换后的头节点
        ListNode* Node = swapPairs(head->next->next);
        head->next->next = head;
        ListNode* ret = head->next;  // 提前保存一下交换后的头节点
        head->next = Node;
        return ret;
    }
};

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

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

相关文章

网络原理---拿捏HTTP协议:请求和响应

文章目录 认识请求首行URLURL的格式URL的encode和decode 版本号方法GET方法POST方法GET VS POST 请求头:headerHostContent-Length 和 Content-TypeUser-Agent(UA)RefererCookie 空行正文:body如何构造HTTP请求?浏览器…

13年测试老鸟,稳定性测试要点+性能监控关键指标分析(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、稳定性测试的要…

【服务配置文件详解】补充rsyslog服务的配置文件翻译解读

学习rsyslog日志管理服务的配置文件 # rsyslog configuration file 关于rsyslog软件的配置文件# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html 想看到更多相关信息,可以去查看这个文件,rsyslog-*的*表示软件版本,我…

近日的ChatGPT宕机事件,竟是黑客组织的蓄谋攻击!?还声称要教训OpenAI和奥特曼

作者 | 王二狗 想必大家都知道了,近日无论是ChatGPT还是其API服务都出现了长时间的线上崩溃! Sam Altman还下场亲自道歉说是因为太受欢迎导致服务器负载超荷。 大模型研究测试传送门 GPT-4传送门(免墙,可直接测试,遇…

实力进阶,再攀高峰!触想智能获评国家级专精特新“小巨人”企业

近日,触想智能收获工业和信息化部颁发的专精特新“小巨人”企业证书,成功跻身全国中小企业实力评优最高梯队。 此项荣誉,不仅是国家权威对触想智能十余年潜心耕耘的深度回响,也进一步激发触想持续奋发、不懈探索的成长底气。 触想…

Ripro-V5 6.4最新版 不限域名无限搭建(授权激活文件)

RiPro主题全新V5版本,是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能&#…

JavaWeb Day09 Mybatis-基础操作01-增删改查

目录 环境准备 ①Emp.sql ②Emp.java 一、删除 ①Mapper层 ②测试类 ③预编译SQL(查看mybatis日志) 1.性能 2.安全 ④总结 二、新增 ①Mapper层 ②测试类 ③结果 ④新增(主键返回) 1.Mapper层 2.测试类 ⑤总结​…

基于YOLOv8与DeepSORT实现多目标跟踪——算法与源码解析

一、概述 "目标跟踪 (Object Tracking)"是机器视觉领域中的一个重要研究领域。根据跟踪的目标数量,可以将其分为两大类:单目标跟踪 (Single Object Tracking,简称 SOT) 和多目标跟踪 (Multi Object Tracking,简称 MOT)…

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证概述笔记重复数字IO的问题想法手工实现程序实现确定要摘掉的数字重合线自动化测试的问题测试程序的场景测试程序的运行效果测试程序实现备注END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-14…

【Linux】编译Linux内核

之所以编译内核,是因为gem5全系统仿真需要vmlinux文件,在此记录一下以备后面需要。 此过程编译之后会获得vmlinux和bzImage两个文件; 主要参考知行大佬的编译内核与gem5官方教程 文章目录 一、Linux源码下载二、安装编译依赖三、编译1. 内核编…

【uniapp】文件授权验真系统(含代码)

文章目录 前言一、框架选用二、数据库设计三、设计上传列表四、上传操作1.前端2.后端 五、修改操作六、访问操作七、二维码生成八、二维码访问九、删除操作总结 前言 吐槽:终于开通了【资源绑定】的功能了,之前还要一个一个的去贴链接 之前的同学联系…

Java12新增特性

前言 前面的文章,我们对Java9、Java10、Java11的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 今天我们来介绍一下Java12版本的新增特性 版本介绍 Java 12是Java SE的第12个版本,于2019年3月19日发布。这个…

口袋参谋:新品上架如何实现月销1w?

​如今在淘宝天猫上,开新店上新品,想要出单是很不容易的。很多商家在新品上架之后,都是非常焦虑的,总是在担心一直没销量该咋办? 以下这几个方法,大家不妨尝试一下; ①打造店铺和产品人群的一致…

MYSQL5.7和MYSQL8配置主从

1、创建专门主从的账号 #登录 mysql -u root -p #创建用户 我这里用户名为test5,注意这里的ip是从库服务器的ip CREATE USER test5192.168.1.20 IDENTIFIED WITH mysql_native_password BY xxxxx; #给主从复制账号授权 grant replication slave on *.* to test5192…

基于Qt Linux开发板USER-KEY按键实现

介绍如何在 Qt 应用上使用嵌入式 GET6818 Linux 开发板 上的按键。 工具:Qt Creator 5.14.2 平台:windows ## 资源简介 在GET6818 开发板,开发板板载资源上有两个用户按键。如下图原理图(下图开发板的按键原理图)。 ## 应用实例 想要监测这个 KEY0,首先出厂内核已经…

Spring的缓存机制-循环依赖

群公告 Java每日大厂面试题: 1、Spring 是如何解决循环依赖? 答案:三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要…

01 计算机图形学概述

什么是图形学 合成和操作视觉信息。 图形学的应用 游戏 电影 动画 模拟 设计 可视化 虚拟现实VR&增强现实AR 电子绘画 图形化UI 字体 图形学的挑战 思维上的挑战 创建与虚拟世界互动需要了解物理世界的各个方面新的计算方法,显示,技术 技术上…

SpringBoot不同环境加载不同配置文件(dev,sit,uat)

目录 一、springboot的profile配置profile多配置文件 二、maven的profiles策略 我们在使用spring的时候,一般都会有不同的环境需要部署:开发环境、测试环境和验收环境,而不同的环境则会有不同的配置,比如数据库ip。解决这个问题&a…

视频批量剪辑:视频合并技巧全攻略,成为视频剪辑专家

在视频制作的过程中,我们常常会遇到需要将多个视频片段合并的需求。这不仅涉及到视频的排列和组合,还需要考虑过渡效果、音频同步等因素。在视频制作过程中,视频批量剪辑是一个非常关键的环节。它可以大大提高工作效率,减少重复劳…

经典OJ题:奇偶链表

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