【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.rhkb.cn/news/103504.html

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

相关文章

java.lang.IllegalStateException: Failed to load ApplicationContext异常

错误原由 今天在编写SpringBoot项目整合MyBatis框架的过程中,产生了这个错误 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheA…

Linux和其他类Unix系统的GNU coreutils 知多少

GNU coreutils是GNU项目的一部分,它是一组基本的命令行工具集,用于操作和管理Linux和其他类Unix系统中的文件和数据流。这些工具被广泛用于终端和脚本中,提供了许多常用的功能和实用程序。Linux和其他类Unix系统的GNU coreutils 知多少&#…

用 VB.net,VBA 两种方式 读取单元格内的 换行数据,并出力到 CSV文件

用 VB.net,VBA 两种方式 读取单元格内的 换行数据,并出力到 CSV文件 需求 如下图所示,为了生成csv文件导入数据库,需要将下图 的 1 和 2 拼接成 如下 3 所示的一行数据, 开头为 1 ,往后为 2 的换行数据 将换…

HTML中SCRIPT 标签中的那些属性

在HTML中&#xff0c; <script> 标签用于嵌入或引用JavaScript代码。 在 <script> 标签中&#xff0c;有两个属性可以用来控制脚本的加载和执行方式&#xff1a; async 和 defer 。 当然这也是常见的一道面试题&#xff0c; async 和 defer 的作用和区别。 asy…

[Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

目录 题目&#xff1a;辗转相除法&#xff08;求最大公约数&#xff09;思路分析&#xff1a;辗转相除法&#xff08;也叫欧几里得算法&#xff09;gcd(a,b) gcd(b,a mod b)复杂度&#xff1a;时间复杂度 O ( n l o g ( m a x ) ) O(nlog(max)) O(nlog(max))、空间复杂度 O (…

轻松实现文件夹名互换,快速批量改名高手工具助您高效管理!

亲爱的用户们&#xff0c;您是否曾经需要将文件夹的名称进行互换&#xff0c;但手动一个一个改名太过繁琐&#xff1f;现在&#xff0c;我们为您推出一款高效的文件夹批量改名工具&#xff0c;让您轻松实现文件夹名的互换&#xff0c;帮助您更好地管理文件&#xff01; 首先&a…

python中的matplotlib画散点图(数据分析与可视化)

python中的matplotlib画散点图&#xff08;数据分析与可视化&#xff09; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

苹果iPhone 15 Ultra和iPhone 15 Pro Max:新名字是否值得期待?

我们即将发现一个名字里有什么,至少如果一个关于iPhone 15 Pro Max的新谣言被证明是准确的。一份新的报告表明,当这款手机可能在苹果9月的发布会上首次亮相时,苹果可能会放弃Pro Max的名字,而将其称为iPhone 15 Ultra。 改名的原因是什么?好吧,这肯定会将苹果最高端的手…

PHP实现每日蛋白质摄入量计算器

1.laravel 路由 //每日蛋白质摄入计算器Route::get(api/protein/intake, FormulaControllerproteinIntakeCal); 2.代码 /*** 每日蛋白质摄入计算器*/public function proteinIntakeCal(){$number intval($this->request(number));$goalFactor array(0.8, 1.16, 0.8, 1.16,…

【sql】MongoDB 增删改查 高级用法

【sql】MongoDB 增删改查 高级用法 相关使用文档 MongoDB Query API — MongoDB Manual https://www.mongodb.com/docs/manual/reference/sql-comparison //增 //新增数据2种方式 db.msg.save({"name":"springboot&#x1f600;"}); db.msg.insert({&qu…

Dubbo3之SerializingExecutor

前言 Dubbo3 提供了一个挺有意思的 Executor&#xff0c;用来将提交到线程池里的任务按顺序串行执行。 需求背景&#xff1a;你有一个线程池&#xff0c;但是你不想修改它&#xff0c;现在你的需求是要把提交上去的任务按顺序串行执行。 在这样一个需求背景下&#xff0c;Ser…

CSS scoped 属性的原理

scoped 一、scoped 是什么&#xff1f;二、实现原理 一、scoped 是什么&#xff1f; 在 Vue 组件中&#xff0c;为了使样式私有化&#xff08;模块化&#xff09;&#xff0c;不对全局造成污染&#xff0c;可以在 style 标签上添加 scoped 属性以表示它的只属于当下的模块&am…

计算机提示mfc120u.dll缺失(找不到)怎么解决

在计算机领域&#xff0c;mfc120u.dll是一个重要的动态链接库文件。它包含了Microsoft Foundation Class (MFC) 库的特定版本&#xff0c;用于支持Windows操作系统中的应用程序开发。修复mfc120u.dll可能涉及到解决与该库相关的问题或错误。这可能包括程序崩溃、运行时错误或其…

基于swing的图书借阅系统java jsp书店进销存mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的图书借阅系统 系统有2权限&#xff1a;管…

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#…

【洛谷算法题】P1000-超级玛丽游戏【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1000-超级玛丽游戏【入门1顺序结构】&#x1f30f;题目描述&#x1f30f;输入格…

【无标题】idea 中 SpringBoot 点击运行没反应,按钮成灰色

问题描述 在使用 Spring Boot 开发项目时&#xff0c;可能会遇到一个问题&#xff1a;点击运行按钮后&#xff0c;控制台没有任何输出&#xff0c;项目界面也没有显示。这种情况可能是由多种原因导致的&#xff0c;本文将介绍一些常见的解决方法。 解决方法 首先看下Groovy插…

如何限制PDF打印?限制清晰度?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…

UI设计第一步,在MasterGo上开展一个新项目

我们都知道&#xff0c;一个完整的项目&#xff0c;要经历创建团队、搭建组件库、应用规范以及管理设计资产&#xff0c;那么今天小编就在MasterGo中带你从0到1开展一个全新的项目。 你一定遇到过这种情况&#xff0c;同团队的设计师&#xff0c;由于使用不同版本或不同软件&a…

js将搜索的关键字加颜色

js将搜索的关键字加颜色 使用正则匹配关键字并加入span标签&#xff0c;页面渲染时使用v-html渲染即可 // 文本框内容 let searchCont 测试;const reg new RegExp((${searchCont.value}), g); let data 图片保存测试A; data data.replace(reg, <span style"color:…