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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

一 前言 MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary …

【开个空调】语音识别+红外发射

废话少说,直接上空调板子:YAPOF3。红外接收发射模块用的某宝上发现的YF-33(遗憾解码还没搞清楚,不然做个lirc.conf功能才多)。最后是语音识别用的幻尔的,某宝自然也有,它是个i2c的接口。 本篇胡说八道其实纯粹为了留个…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后,可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后,再连接虚拟机就连不上了,于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题,又可以连接上了&#xff…

飞天使-k8s基础组件分析-pod

文章目录 pod介绍pod 生命周期init 容器容器handlerpod中容器共享进程空间sidecar 容器共享 参考链接 pod介绍 最小的容器单元 为啥需要pod? 答: 多个进程丢一个容器里,会因为容器里个别进程出问题而出现蝴蝶效应,pod 是更高级的处理方式pod 如何共享相…

(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

目录 1、责任链模式(Chain of Responsibility Pattern)含义 2、责任链模式的UML图学习 3、责任链模式的应用场景 4、责任链模式的优缺点 5、C实现责任链模式的实例 1、责任链模式(Chain of Responsibility Pattern)含义 责任…

存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)

存在逻辑删除的表字段上建立唯一索引的巧办法 首先,我们肯定是清楚地知道唯一键值逻辑删除位如果联合创建唯一索引的话,只能最多存在两条数据,无法满足不断删除新增的需求,所以需要一个巧妙的办法去实现有逻辑删除标志位的唯一索…

【Java 高阶】一文精通 Spring MVC - 基础概念(一)

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理,可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能,使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…

(排序) 剑指 Offer 51. 数组中的逆序对 ——【Leetcode每日一题】

❓剑指 Offer 51. 数组中的逆序对 难度:困难 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff…

Docker关于下载,镜像配置,容器启动,停止,查看等基础操作

系列文章目录 文章目录 系列文章目录前言一、安装Docker并配置镜像加速器二、下载系统镜像(Ubuntu、 centos)三、基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母)四、容器的启动、 停止及重启…

STM32电源名词解释

STM32电源架构 常用名词 VCC Ccircuit 表示电路,即接入电路的电压。 VDD Ddevice 表示器件, 即器件内部的工作电压。 VSS Sseries 表示公共连接,通常指电路公共接地端电压。 VDDA Aanalog 表示模拟,是模拟电路部分的电源。主要为…

【C语言】C语言用数组算平均数,并输出大于平均数的数

题目 让用户输入一系列的正整数&#xff0c;最后输入“-1”表示输入结束&#xff0c;然后程序计算出这些数的平均数&#xff0c;最后输出输入数字的个数和平均数以及大于平均数的数 代码 #include<stdio.h> int main() {int x;double sum 0;int cnt 0;int number[100…