【算法】链表:24.两两交换链表中的节点

news2024/10/9 23:35:48

目录

1、题目链接 

2、题目介绍

3、解法

4、代码


 

1、题目链接 

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

2、题目介绍

3、解法

  1. 引入伪头节点
    • 为了处理头节点可能被交换的情况,我们引入一个伪头节点(dummy node),它的next指针指向原链表的头节点。这样做可以简化边界条件的处理,因为头节点也可能需要被交换。
  2. 初始化指针
    • prevPair:记录当前处理的节点对之前的那个节点,初始化为伪头节点。
    • first:当前处理的节点对中的第一个节点,初始化为链表的头节点。
    • second:当前处理的节点对中的第二个节点,初始化为头节点的下一个节点(如果存在)。
  3. 遍历链表
    • 使用一个while循环遍历链表,条件是firstsecond都不为空。这表示还有节点对需要处理。
  4. 交换节点
    • 在每次循环中,首先记录下一对节点的起始位置(nextPairStart),即当前second节点的下一个节点。
    • 然后,交换firstsecond节点的位置。这通过调整指针来完成,而不需要移动节点本身。
    • 更新prevPair->next,使其指向新的第一个节点(原来的second节点)。
    • 更新second->next,使其指向原来的first节点。
    • 更新first->next,使其指向nextPairStart,即下一对节点的起始位置。
  5. 更新指针
    • 更新prevPair为当前处理的节点对中的第一个节点(经过交换后可能变成了第二个节点,但在这里我们总是更新为逻辑上的“第一个”,即当前对的最前端)。
    • 更新first为下一对节点的第一个节点(nextPairStart)。
    • 如果first不为空,则更新secondfirst->next;否则,将second设置为nullptr(虽然这在循环结束时自动成立,但显式设置可以提高代码清晰度)。
  6. 返回结果
    • 循环结束后,返回伪头节点的next指针,它现在指向交换后的链表的头节点。

关键点

  • 使用伪头节点简化边界条件处理。
  • 通过调整指针来交换节点,而不是移动节点本身。
  • 正确地更新所有相关的指针,以确保链表结构的完整性。

4、代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;  // 伪头节点  

        ListNode* prevPair = dummy;  // 记录每一对节点的前一个节点  
        ListNode* first = head;      // 当前处理的节点对中的第一个节点  
        ListNode* second = head ? head->next : nullptr;  // 当前处理的节点对中的第二个节点  

        while (first && second) {
            // 记录下一对节点的第一个一个节点  
            ListNode* nextPairStart = second->next;

            // 交换节点  
            prevPair->next = second;
            second->next = first;
            first->next = nextPairStart;

            // 更新 prevPair 和节点对  
            prevPair = first;
            first = nextPairStart;
            if (first) {
                second = first->next;
            }
            else {
                second = nullptr;
            }
        }

        return dummy->next;
    }
};

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

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

相关文章

jenkins远程调用

curl -G -d tokenfetch_coverage_token&systemmes2&typefull&envsit&resetno http://remote_user:1172e3d5524629fabef5dd55c652646232192.168.36.196:8080/job/fetch_coverage/buildWithParameters 在jenkins的用户界面设置一个token就可以了 remote_user 为…

Android笔记(二十四)基于Compose组件的MVVM模式和MVI模式的实现

仔细研究了一下MVI(Model-View-Intent)模式,发现它和MVVM模式非常的相识。在采用Android JetPack Compose组件下,MVI模式的实现和MVVM模式的实现非常的类似,都需要借助ViewModel实现业务逻辑和视图数据和状态的传递。在这篇文章中&#xff0c…

ESP32-C3实现UART

配置串口参数 在编写代码之前,你需要确定要使用的 UART 端口号和配置参数(波特率、数据位、停止位等)。 // 定义 UART 端口 #define TX_PIN 1 // TX 管脚 #define RX_PIN 3 // RX 管脚// 定义串口配置参数 #define UART_BAUDRATE 115200 // …

springboot 项目使用 gitlab 的 API

springboot 项目使用 gitlab 的 API 前言获取用户 access tokenSpring boot项目集成GitLab依赖1 pom依赖2 配置文件3 启动类4 核心代码gitlab 的 API 说明前言 需求是通过gitlab的api获取其中的数据。 gitlab官方API文档:https://docs.gitlab.com/ee/api/users.html gitla…

SpringBoot实现电子文件签字+合同系统

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 在现代企业中,合同管理和电子文件签字已成为日常运营不可或缺的一部分。为了提升效率和安全性,我们可以使用SpringBoot框架来实现一个电子文件签字和合同管理系统。本文将详细介绍如何…

腾讯云SDK连麦应用

音视频终端 SDK(腾讯云视立方)将新版连麦管理方案的多个功能集成至 腾讯云视立方控制台 > 连麦管理,便于用户快捷使用,具体分为快速上手、连麦应用、用量统计和地址生成器四个功能页面。更多连麦功能说明,请参见 新…

【算法刷题指南】BFS解决FloodFill算法

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

Leetcode - 周赛418

目录 一,3309. 连接二进制表示可形成的最大数值 二,3310. 移除可疑的方法 三,3311. 构造符合图结构的二维矩阵 四,3312. 查询排序后的最大公约数 一,3309. 连接二进制表示可形成的最大数值 本题数据范围较小&#…

sklearn机器学习实战——随机森林回归与特征重要性分析全过程(附完整代码和结果图)

sklearn机器学习实战——随机森林回归与特征重要性分析全过程(附完整代码和结果图) 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目…

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…

爆红网络的膨胀飞天视频,背后竟是Pika1.5 AI视频模型!

最近,社交网络上疯传着各种动物、建筑等物体膨胀飞上天的搞笑视频。无论是真实的还是虚构的物体,都在视频中被压扁、融化、膨胀,引发了广泛的病毒式传播。而这些有趣的效果,都是由Pika最新推出的1.5版本AI视频模型所制作的。 Ai …

STM32输入捕获模式详解(下篇):PWM输入捕获与PWI模式

1. 前言 在上篇文章中,我们详细介绍了STM32输入捕获模式的基本原理和应用方法,包括测频法和测周法。本文将重点探讨如何通过STM32的PWI(PWM Input)模式实现对PWM信号的频率和占空比测量。我们将结合具体的硬件电路,解…

[万字解析]从零开始使用transformers微调huggingface格式的中文Bert模型的过程以及可能出现的问题

系列文章目录 使用transformers中的pipeline调用huggingface中模型过程中可能遇到的问题和修改建议 [万字解析]从零开始使用transformers微调huggingface格式的中文Bert模型的过程以及可能出现的问题 文章目录 系列文章目录前言模型与数据集下载模型下载数据集下载 数据加载、…

单细胞转录组 —— simpleaf 原始数据处理

单细胞转录组 —— 原始数据处理实战(simpleaf) 前言 Alevin-fry 是一个快速、准确且内存节约的单细胞和单核数据处理工具。 Simpleaf 是用 Rust 编写的程序,它提供了一个统一且简化的界面,用于通过 alevin-fry 流程处理一些最…

软件设计师——系统基础开发

📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:软件设计师——信息安全🌟其他专栏🌟:C语言_秋邱 ​ 一、软件工程概述 1.1、考…

【Linux】man手册安装使用

目录 man(manual,手册) 手册安装: 章节区分: 指令参数: 使用场景: 手册内容列表: 手册查看快捷键: 实例: 仍致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 在开头先提醒一下:在 man 手册中退出的方法很简单…

数字IC/FPGA AMBA总线 (内容参考B站UP主数字逻辑君)

1、 串行总线 SPI IIC UART Fsmc (串行总线本文不再赘述,可以参考作者其他文章) 总线简介: AMBA常用的系统总线:AHB,ASB,APB,AXI总线,一个Soc和外部的外设不可能每…

zigbee学习

24.10.7学习目录 一.简介1.分层2.zstack通信 一.简介 其是一种新兴的短距离无线通信技术,用于传感控制应用; 特性: 低功耗,比wifi蓝牙功耗更低;低成本;低速率;近距离;短时延&…

老外发微信时说“I‘ll ping you”是什么意思?发微信怎么用英语说柯桥学英语到哪里?

“发信息”还可以怎么说? 其实很简单,message做动词时,可以直接表达:发信息 ▼ 🌰举个例子 I messaged him yesterday but havent had a reply. 昨天我给他发了短信,但没有回音。 我们现在常说的“发信…

使用Python批量修改文件修改日期为随机的6到8月份

使用Python批量修改文件修改日期为随机的6到8月份 每当雪花飘起的时候,总有一股抹不去的情节,会想起儿时雪天的记忆,虽然模糊但也清晰。那时每年的冬季很冷,但依然喜欢飘雪的日子,看着满天迷蒙飘舞的雪花总有想不完的心…