LeetCode 算法:两两交换链表中的节点 c++

原题链接🔗:两两交换链表中的节点
难度:中等⭐️⭐️

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1
在这里插入图片描述

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2

输入:head = []
输出:[]

示例 3
输入:head = [1]
输出:[1]

提示

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

题解

迭代法【双指针迭代法】

  1. 题解

"两两交换链表中的节点"是一个常见的链表问题,它主要考察对链表操作的理解和双指针技巧的应用。下面是解决这个问题的一般思路:

  1. 理解问题:首先明确题目要求,即给定一个链表,需要将链表中的节点两两交换,如果链表长度为奇数,最后一个节点保持不变。

  2. 虚拟头节点:为了简化操作,特别是处理原链表头节点的交换,可以创建一个虚拟头节点(dummy node),它的next指向原链表的头节点。这样,我们可以统一处理所有情况,包括链表只有一个节点或为空的情况。

  3. 使用双指针:定义两个指针currentprevcurrent用于遍历链表,prev用于指向当前current节点的前一个节点。初始时,prev指向虚拟头节点。

  4. 遍历链表:遍历链表,每次循环处理一对节点。在每次循环中:

    • 检查currentcurrent->next是否非空,确保有一对节点可以交换。
    • 交换currentcurrent->next的节点。可以通过改变指针的指向来实现节点的交换,而不需要移动节点的数据。
  5. 交换节点:交换节点的步骤如下:

    • 保存current->next的下一个节点,即second
    • secondnext指向current
    • current->next指向second
    • 更新prevnext指向second,即交换后的第二个节点。
  6. 更新指针:交换完成后,更新prev为当前的currentcurrent向前移动两位,即移动到下一对节点。

  7. 处理特殊情况:如果链表长度为奇数,循环结束后,current将指向最后一个节点,此时不需要交换,直接结束循环。

  8. 返回结果:最后,返回虚拟头节点的下一个节点,即交换后链表的新头节点。

  9. 释放资源:如果有必要,释放所有动态分配的节点,以避免内存泄漏。

这个算法的时间复杂度是O(n),其中n是链表的长度,因为我们只遍历了链表一次。空间复杂度是O(1),因为我们只使用了有限的额外空间。

  1. 复杂度: 时间复杂度O(n),其中n是节点数,空间复杂度O(1)。
  2. 代码过程:如demo所示。
  3. c++ demo
#include <iostream>// 定义链表节点结构体
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 两两交换链表中的节点
ListNode* swapPairs(ListNode* head) {// 虚拟头节点,方便处理ListNode* dummy = new ListNode(0);dummy->next = head;// 指向当前需要交换的节点ListNode* current = dummy;while (current->next && current->next->next) {// 交换两个节点ListNode* first = current->next;ListNode* second = current->next->next;first->next = second->next;current->next = second;second->next = first;// 移动到下一对节点current = first;}// 返回新链表的头节点ListNode* newHead = dummy->next;delete dummy; // 释放虚拟头节点return newHead;
}// 打印链表的函数,用于验证结果
void printList(ListNode* head) {while (head) {std::cout << head->val << " ";head = head->next;}std::cout << std::endl;
}// 测试代码
int main() {// 创建示例链表: 1->2->3->4ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);std::cout << "Original List: ";printList(head);// 调用函数交换节点ListNode* newHead = swapPairs(head);std::cout << "Swapped List: ";printList(newHead);// 释放链表内存while (newHead) {ListNode* temp = newHead;newHead = newHead->next;delete temp;}return 0;
}
  • 输出结果:

Original List: 1 2 3 4
Swapped List: 2 1 4 3
在这里插入图片描述

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

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

相关文章

find 查找 Bazel 构建覆盖率文件的一个☝️坑

Bazel 是由 Google 开发的一个高效、可扩展的开源构建和测试工具&#xff0c;主要用于管理大型代码库。它支持多语言&#xff08;如 C, Java, Python&#xff09;和多平台构建&#xff0c;通过强大的构建缓存和并行化机制显著提高构建速度。 背景 利用Bazel构建项目时&#xf…

STM32单片机SPI通信详解

文章目录 1. SPI通信概述 2. 硬件电路 3. 移位示意图 4. SPI时序基本单元 5. SPI时序 6. Flash操作注意事项 7. SPI外设简介 8. SPI框图 9. SPI基本结构 10. 主模式全双工连续传输 11. 非连续传输 12. 软件/硬件波形对比 13. 代码示例 1. SPI通信概述 SPI&#x…

彻底卸载CAD2016两个关键点,解决许可过期问题

文章目录 1.使用自带卸载工具&#xff0c;避免卸&#xff5e;漏。 【开始菜单】-【Autodesk】-【Uninstall Tool】。 2.删除许可数据&#xff1a; 删除【C:\ProgramData\FLEXnet】下文件。 tips&#xff1a; 1.C:\ProgramData是隐藏文件夹。 2.FLEXnet&#xff1a;软件许可管…

keepalived高可用,LVS+keepalived的实现

概述&#xff1a; keepalived是集群高可用的一个技术&#xff0c;它是一个软件&#xff0c;与网络技术中VRRP协议的实现相类似&#xff0c;都是在若干个服务集群后虚拟出的一个对外提供服务的VIP(Virtual IP)&#xff0c;即虚拟IP&#xff0c;当某一台服务器发生故障时&#x…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化&#xff1f;怎么使用API接口发信&#xff1f; 腾讯云API作为腾讯云提供的核心服务之一&#xff0c;广泛应用于各行各业。然而&#xff0c;随着API应用的普及&#xff0c;API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…

数据结构之B树详解(极简)

一、引言 1&#xff09;介绍数据结构的重要性 在计算机科学中&#xff0c;数据结构是解决问题和优化性能的关键。它们是组织和存储数据的方式&#xff0c;直接影响着我们如何访问、检索和操作数据。一个恰当的数据结构选择可以显著提高算法的效率&#xff0c;降低时间复杂度和…

Scala 转义字符

Scala 转义字符 Scala作为一种多范式的编程语言,提供了丰富的转义字符集,用于在字符串中插入特殊字符。这些转义字符对于处理文件路径、正则表达式以及其他需要特殊字符的场合至关重要。本文将详细介绍Scala中的转义字符,并提供实际的应用示例。 什么是转义字符? 转义字…

Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令 ls -al 实现 #include <43func.h> void error_check(int ret, const char *msg) {if (ret -1) {perror(msg);exit(EXIT_FAILURE);} }char get_file_type(mode_t mode) {if (S_ISREG(mode)) return -;//检查给定的文件模式&#xff08;通常是从 stat 或 lst…

Linux——ansible中handlers

理解 1.按照已有的剧本写法 如果要完成下面这些操作&#xff1a; 1&#xff09;安装软件包&#xff1a;mysql&#xff0c;httpd&#xff0c;mysql-server&#xff0c;php 2&#xff09;复制配置文件&#xff1a;web&#xff0c;db&#xff0c;php 3&#xff09;后续追加配置文…

数据结构—排序、查找、图论和字符串算法之Java实例

一&#xff1a;引言 在编程的海洋中&#xff0c;算法是程序员的灵魂之光。它们不仅指引着代码的前进方向&#xff0c;更能解决难题&#xff0c;提升效率。虽然各式各样的算法琳琅满目&#xff0c;但其中有一些却是每位程序员必定会遇到且应当深刻掌握的。本文将带您走进这些至…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

【arm扩容】docker load -i tar包 空间不足

背景&#xff1a; 首先我在/home/nvidia/work下导入了一些镜像源码tar包。然后逐个load进去。当我 load -i dev-aarch64-18.04-20210423_2000.tar包的时候&#xff0c;出现 Error processing tar file(exit status 1): write /9818cf5a7cbd5a828600d9a4d4e62185a7067e2a6f2ee…

聚合函数和开窗函数中order by结合使用时,窗口区间不是完整区间

hive踩坑笔记 —— 开窗函数为聚合函数时&#xff0c;加order by 与不加 order by的区别_order by sum举例子-CSDN博客 文章中说&#xff0c;混用时窗口区间等价于 rows between unbounded preceding and current row &#xff0c;测试时表象与此描述不一致&#xff0c;如max&a…

【每日刷题】Day71

【每日刷题】Day71 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 牛群分隔 2. 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 3. 791. 自定义字符串排序 -…

C语言 | Leetcode C语言题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; int majorityElement(int* nums, int numsSize) {int ans 0;for (int i 0, cnts 0; i < numsSize; i) {if (nums[i] ans) {cnts;} else if (cnts 0) {ans nums[i];} else {cnts--;}}return ans; }

数据结构经典面试之数组——C#和C++篇

文章目录 1. 数组的基本概念与功能2. C#数组创建数组访问数组元素修改数组元素数组排序 3. C数组创建数组访问数组元素修改数组元素数组排序 4. 数组的实际应用与性能优化5. C#数组示例6. C数组示例总结 数组是编程中常用的数据结构之一&#xff0c;它用于存储一系列相同类型的…

基于.NET开源跨平台的文档管理系统

前言 今天大姚给大家分享一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台的文档管理系统&#xff1a;Dorisoy.Pan。 官方项目介绍 Dorisoy.Pan是一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台文档管理系统&#xff0c;使用MS S…

使用Python进行Web开发:从基础到实战

使用Python进行Web开发:从基础到实战 Python不仅是一门数据科学的利器,也是一门强大的Web开发语言。得益于其简洁的语法和丰富的生态系统,Python在Web开发领域同样大放异彩。本文将介绍Python在Web开发中的基础知识、常用框架以及一个完整的实战项目,帮助读者从基础入门到…

CDP问卷的目的是什么?CDP问卷对企业有什么好处

CDP问卷&#xff08;Carbon Disclosure Project问卷&#xff09;的目的是多方面的&#xff0c;主要包括以下几点&#xff1a; 推动透明度&#xff1a;CDP问卷要求企业公开披露其温室气体排放数据、减排目标和行动&#xff0c;以及气候风险管理策略等信息。这有助于增强企业的透…

字符串逆序(递归实现)

目录 代码要求 代码实现 代码逻辑 逆序字符串&#xff0c;不使用递归实现&#xff08;推荐&#xff09; 代码要求 编写一个函数reverse_string(char* string) &#xff08;递归实现&#xff09;实现&#xff1a;将参数字符串中的字符反向排列&#xff0c;不是逆序打印要求&…