【leetcode 力扣刷题】交换链表中的节点

news2025/1/10 23:46:56

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

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

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

相关文章

跨境电商shopee平台怎么样?Shopee选品工具是什么?

跨境电商shopee平台市场可以说是相当活跃和竞争激烈的电商市场。作为东南亚地区最大的电商平台之一,跨境电商shopee平台覆盖了多个国家和地区,包括新加坡、马来西亚、泰国、印度尼西亚、越南、菲律宾和台湾。 跨境电商shopee平台市场的活跃程度体现在以下…

广州华锐互动:3D航天科学网上展馆让你沉浸式体验航天文化

3D航天科学网上展馆是一种利用先进的3D技术和虚拟现实技术展示航天科技的场所。与传统的展馆相比,3D航天科学网上展馆具有许多独特的特色。以下是3D航天科学网上展馆的一些主要特色: 1.沉浸式体验:3D航天科学网上展馆通过虚拟现实技术为观众提…

Windows10查看图片的分辨率

文章目录 查看方法 查看方法 鼠标悬停在想查看分辨率大小的图片上,稍等那么零点几秒,就会弹出图片的分辨率信息,如图所示:

单片机系统的电磁兼容设计

目录 1.什么是单片机 2.单片机的应用领域 3.单片机系统常见的电磁干扰 4.电磁干扰对单片机造成的影响 5.如何消除单片机系统的电磁干扰 1.什么是单片机 单片机是一种集成电路芯片,也被称为微控制器。它集成了中央处理器(CPU)、存储器、输…

湘潭大学 湘大 XTU OJ 1441 平衡三进制2 题解(非常详细)

前置知识 很多时候我们觉得一件事情难,其实并不是这一整件事情难,而是中间有一部分(极端情况是几乎所有)东西我们不知道,没有相关的经验,所以我们不断地学习 这道题目的前置知识是十进制转三进制怎么转换…

朋友圈发圈文案防折叠不折叠转换流量主小程序开发

朋友圈发圈文案防折叠不折叠转换流量主小程序开发 不折叠:转发此条动态,帮我解锁朋友圈新技能,让你的朋友圈更加精彩!折叠转不折叠:转发此动态,即可开启朋友圈折叠转不折叠的功能,让你的朋友圈…

第七章 类、结构体、指针与引用

目录 1.基础知识2.练习题2.1 斐波那契数列2.2 替换空格2.3 求12…n2.3.1 方法一:2.3.2 方法二: 2.4 在O(1)时间删除链表结点2.5 合并两个排序的链表2.6 左旋转字符串2.7 把字符串转换成整数2.8 反转链表2.9 两个链表的第一个公共结点2.10 删除链表中重复…

错误代码0xc0000225要怎么解决?一招教你快速搞定

在运行 Windows 10 操作系统时,您可能会遇到一个错误代码为 0xc0000225 的问题,导致无法正常启动系统。这个错误通常与系统引导文件或硬盘驱动器有关。在本文中,我们将详细介绍多种解决方法来解决 0xc0000225 错误,以帮助您重新恢…

如何选择图像标注工具?

图像标注属于数据标注的一种类型。也许数据标注是人工智能领域不为人知的工作,但也是取得人工智能项目的成功不可或缺的一个环节。数据标注平凡而不平庸,标注的数据质量将直接影响模型的质量。选择恰当高效的标注工具也决定着数据的产出质量。 图像标注作…

AI 绘画Stable Diffusion 研究(十四)SD 图生图+剪映制作人物说话视频

大家好,我是风雨无阻。 前一篇,我们详细介绍了使用 SadTlaker制作数字人视频案例,感兴趣的朋友请前往查看:AI 绘画Stable Diffusion 研究(十三)SD数字人制作工具SadTlaker使用教程。 对于没有安装 SadTlaker 插件的朋友…

AST+chatGPT降维系列|某cookie反爬之acw_sc__v2分析

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1. 目标网站 aHR0cHM6Ly93d3cuY2R0LWVjLmNvbS9ob21lL21vcmUtenlnZy5od…

【升职加薪秘籍】我在服务监控方面的实践(8)-elasticsearch 性能监控与分析手段

大家好,我是蓝胖子,之前讲了mysql,redis中间件的监控,今天我们再来看看另一个基础组件elasticsearch,如何对它进行监控,当你思考如何对一个组件进行监控时,四大黄金指标会告诉你答案&#xff0c…

【使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 安装搭建私有仓库 Harbor】

1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 [rootnode1 ~]# docker pull mysql:5.6 [rootnode1 ~]# docker pull owncloud [rootnode1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.6 dd3b2a5d…

TypeScript——类型系统与类型推导

前言 TypeScript 是由 Microsoft 开发的一种开放源代码语言。 它是 JavaScript 的一个超集,这意味着你可以在 TypeScript 中使用 JS 已存在的所有语法,并且所有 JavaScript 脚本都可以当作 TypeScript 脚本,此外它还增加了一些自己的语法。T…

如何为短信营销制定最佳策略

营销是一个永无止境的过程,不断寻找新的和创新的方式来吸引更多客户或与他们沟通。短信于1992年首次发出,现在已经31岁了。这可能看起来有点老派,但你会惊讶于这项技术是如何卷土重来的,特别是对于小企业。打开率为98%&#xff0c…

STM32输出3对PWM互补信号做电机控制-C代码

1、使用芯片STM32F103VC 2、打开MXCube新建工程 3、配置下载模式为SW,外部晶振8M,主频72M 4、配置高级定时器1,使用内部晶振,开启互补PWM输出模式 5、配置载波频率10k,即周期为10us (定时周期 (Prescal…

c语言实现栈

文章目录 前言一、栈的特征二、栈的实现1、栈的设计2、栈的初始化和销毁3、元素的入栈和出栈4、返回栈顶元素 三、栈的应用 前言 在学习完链表之后,接下来就要了解另外的两个常用的线性数据结构,栈和队列。 一、栈的特征 栈:一种特殊的线性…

斩获多家名校邀请函|检验医师终赴多伦多大学访学深造

M医生学术背景不错,具备较扎实的基础医学理论及较熟练的实验技能,也有一定的英语能力,但因本身不够自信,担心申请不到名校通不过CSC审批。我们先后为其获得新加坡科技研究局(A*Star)、加拿大麦吉尔大学、多…

为什么企业需要IT服务管理?

什么是IT服务管理? 将IT服务管理功能扩展到技术服务之外,解决以业务为中心通过单一平台,门户和服务目录管理服务供需,通过PaaS/低代码开发工具加速创新和工作流自动化。 为什么企业需要IT服务管理? 为了更好管理公司内不同业务&a…

功能强大、超低功耗的STM32WL55JCI7、STM32WL55CCU7、STM32WL55CCU6 32位无线远距离MCU

STM32WL55xx 32位无线远距离MCU嵌入了功能强大、超低功耗、符合LPWAN标准的无线电解决方案,可提供LoRa、(G)FSK、(G)MSK和BPSK等各种调制。STM32WL55xx无线MCU的功耗超低,基于高性能Arm Cortex-M4 32位RISC内核(工作频率高达48MHz&#xff09…