【leetcode 力扣刷题】交换链表中的节点
24. 两两交换链表中的节点
- 24. 两两交换链表中的节点
- 两两节点分组,反转两个节点连接
- 递归求解
24. 两两交换链表中的节点
题目链接:24. 两两交换链表中的节点
题目内容:

题目中强调不能修改节点内部值,是因为如果不加这个限制的话,直接将两个节点的值交换就好了,不涉及到节点间连接的重新建立,很容易实现。但是加了这个限制以后,就只能改变节点间的连接了。
两两节点分组,反转两个节点连接
其实这就是一道涉及到链表基本操作的题目,题目的要求是将链表中的节点,按照两个两个的分组,【包括组内、和前一组、和后一组,改变节点连接的操作】:
- 1、组内的两个节点原来是前一个节点currNode指向后一个节点tmp 【tmp = currNode->next 】,现在变成tmp->next = currNode;
- 2、组内的前一个节点currNode,现在指向下一组节点的【两个节点】的前面一个,即currNode->next = tmp->next;【注意这里的tmp->next是第1步还未进行前,原始的currNode的下下一个节点;
- 3、前一组节点【两个节点】的后面一个节点preNode原来是指向currNode的,现在应该指向tmp;
之后currNode向后移动,遍历所有这样的分组。整个过程如下所示:

实现细节:
- 对于第一组节点,交换两个节点后,头节点会改变【以preNode是不是null来判断】;
- 因为是两两分组,从当前分组变到下一个分组,按道理应该是currNode = currNode->next->next,但是由于上述第2步中,currNode->next = tmp->next;所以currNode = currNode->next就达到了向前移动两个节点的目的;
- 如果总共有偶数个节点,那么两两分组交换,刚好;如果是奇数个节点,最后一个节点不变。
代码实现如下(C++):
class Solution {
public:ListNode* swapPairs(ListNode* head) {//如果链表为空 或只有一个节点 不需要交换if(head == nullptr || head->next == nullptr)return head;//preNode是前一组节点里面的后面一个//currNode是当前一组节点中前面一个ListNode *preNode = NULL, *currNode = head;//遍历完的条件while(currNode && currNode->next){ListNode *tmp = currNode->next; //先保存这个指针currNode->next =tmp->next; //改变和下一组节点的连接tmp->next = currNode; //改变组内节点的连接if(preNode){ preNode->next = tmp; //改变前一组节点和当前组节点的连接} else{ //如果preNode是nullptr说明是第一组,头节点会改变head = tmp;} //向后移动,到下一个分组preNode = currNode;currNode = currNode->next; }return head;}
};
递归求解
由于链表的定义是递归的,这道题依旧可以用递归的办法来解决。先搞清楚以下三个问题:
- 递归的终止条件是什么?
- 当前节点要做什么操作?
- 向前返回的是什么?
递归依然是到递归终止条件,才开始向前返回结果。所以是链表后半部分的分组先完成了组内节点连接的改变,再向前返回,返回的是后半部分链表完成了两两交换节点后的头节点。递归终止条件是head==null || head->next == null。在当前节点需要做什么呢?
- 交换组内节点,即head->next这个节点要指向head【head->next->next = head】;
- 和后面部分链表返回的头节点连接,head->next =递归函数返回的头结点;
- 向上返回从当前节点开始的这段链表,完成两两节点交换后的头节点。
代码实现如下(C++):
class Solution {
public:ListNode* swapPairs(ListNode* head) {//递归终止条件if(head == nullptr || head->next == nullptr)return head;//要返回的新头节点ListNode *newhead = head->next; //与后半段链表完成了两两节点交换后返回的头节点建立新连接head->next= swapPairs(head->next->next);//组内节点改变连接newhead->next = head;//返回新头节点return newhead; }
};
相关文章:
【leetcode 力扣刷题】交换链表中的节点
24. 两两交换链表中的节点 24. 两两交换链表中的节点两两节点分组,反转两个节点连接递归求解 24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目内容: 题目中强调不能修改节点内部值,是因为如果不加这个限制的话…...
学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Mybatis动态SQL如何应用 1.需求 2.…...
Oracle 中 ROWNUM 使用问题记录
ROWNUM 使用问题记录(2023-08-17) Oracle 版本: 19.0.0.0.0 Enterprise现象:今天在项目遇到一个问题,测试人员反馈前一天能看到的数据今天看不到了 用表格举例,这是前一天看到的数据,有9、7、1 这几个数量信息 日期…...
MySQL数据库:内置函数
日期函数 规定:日期:年月日 时间:时分秒 函数名称作用描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_type)在date中添加…...
【C++杂货铺】探索string的底层实现
文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…...
c++ day1
定义一个命名空间Myspace,包含以下函数:将一个字符串中的所有单词进行反转,并输出反转后的结果。例如,输入字符串为"Hello World",输出结果为"olleH dlroW",并在主函数内测试该函数。 …...
变动的Python爬虫实现
在电商时代,了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例,您将能够轻松监控商品价格,并及时做出决策。 一、了解需求和目标 在…...
mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除
写在前面: 本文主要介绍mybatis-plus的配置,以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql,这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…...
数据API服务管理功能:解放数据潜力,提升业务效率
数据API服务的重要性 在数字化时代,数据被认为是企业的重要资产。数据API服务的管理功能能够有效帮助企业实现数据的整合和利用。通过合理的数据API服务管理,企业可以更好地解放数据潜力,提升业务效率。 解放数据潜力 数据API服务管理功…...
云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力
据统计,每一场破坏性地震发生后,会引发次生的灾害,而火灾是其中之一。导致火灾的原因,推测是地震时使供电线路短路,引燃易燃物,火灾就随即发生。所以,在日常生活中,定期的消防演练还是非常必要的, VR消防,是VR公司深圳华锐视点利用VR虚拟现实技术,将VR和…...
(6)(6.2) 任务命令
文章目录 前言 6.2.1 概述 6.2.2 导航命令 6.2.3 条件命令 6.2.4 DO命令 前言 本文介绍了 Copter、Plane 和 Rover 切换到自动模式时支持的任务指令。 !Warning 这是一项正在进行中的工作,尚未经过全面审核。有关 Copter 的更佳列表,请…...
【consul】
consul 一、什么是服务注册与发现1.11.2 二、 什么是consul2.1定义2.2特性2.2.1服务注册与发现:2.2.2健康检查:2.2.3Key/Value存储: 三、consul部署-datacenter :指定数据中心名称,默认是dc1。consul :指定…...
Electron环境搭建
Electron是一个优秀的开源框架,用于构建跨平台的桌面应用程序。它基于Chromium和Node.js,使得开发者可以使用Web技术(HTML、CSS和JavaScript)来构建可在Windows、macOS和Linux等多个操作系统上运行的应用程序。本文将介绍如何搭建…...
MinIO线上扩容实战
硬件投入肯定是随着业务的增长而增长,这就要求中间件平台必须提供水平伸缩机制,MinIO对象存储服务也不例外,本文就详细介绍MinIO的扩容。 Minio支持通过增加新的Server Pool来扩容老的集群。每个Server Pool都是一个相对独立的故障域&#x…...
【微服务】微服务的概论
微服务:构建面向为了解决这个问题,微服务架构应运而生。本文将向您介绍微服务的概念、优势、实现原理以及应用场景,带您领略微服务在构建面向未来的高效应用中的魅力。 一、微服务的概念和优势 微服务是一种将应用拆分为一系列小型、独立服…...
基于Jenkins自动打包并部署docker环境
目录 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 实验环境 操作系统 IP地址 主机名 角色 CentOS7.5 192.168.200.111 git git服务器 CentOS7.5 192.168.200.112 Jenkins git客户端 jenkins服务器 CentOS7.5 192.168…...
jvm 运行时数据区
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁 1.1程序计数器 程序计数器也叫pc寄存器 可以看作是当前线程…...
Jobs Portal求职招聘系统源码v3.5版本
Jobs Portal求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。 它将提供各种公司在网站上放置他们的职位空缺资料,并且还可以选择搜索候选人简历。 除此之外,还有一个管理模块供…...
Android kotlin系列讲解(入门篇)使用Intent在Activity之间穿梭
<<返回总目录 上一篇:Android kotlin系列讲解(入门篇)Activity的理解与基本用法 文章目录 1、使用显式Intent2、使用隐式Intent3、更多隐式Intent的用法4、向下一个Activity传递数据5、返回数据给上一个Activity1、使用显式Intent 你应该已经对创建Activity的流程比较…...
音频编码类型及对应的封装文件
音频编码类型及对应的封装文件 如下表格 编码类型解释文件封装audio/mp4a-latmMPEG-4 Audio Advanced Audio Coding (AAC) Low-Overhead Audio Transport Multiplex (LATM) 压缩的音频格式mp4audio/3gpp3rd Generation Partnership Project (3GPP) 定义的音频编码格式3GPaudi…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
