【算法与数据结构】24、LeetCode两两交换链表中的节点

news2025/4/9 14:23:39

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:题目要求两两交换节点。在链表当中非常重要就是下一个节点,一旦丢失,这个节点后面的节点也就找不到了。那么我们在需要再交换前后做好保存节点变量的工作,程序当中我们设置了两个临时变量,例如在[1 2 3 4]这个链表当中,第一次交换(交换1 2 节点),cur指向虚节点,tmp1指向第一个节点(也就是1),tmp2需要指向第三个节点,因此修改指针的过程中会丢失。首先,让cur节点指向第2个节点,第2个节点指向第1个节点,第1个节点指向第3个节点,这样就完成了第一次交换。其次,我们做更新操作,注意第一次交换是三个指针的相对位置(tmp1是cur的下一个节点,tmp2是tmp1的next next节点),因此下一次循环也循序这个规则
在这里插入图片描述

  程序如下

class Solution {
public:
	ListNode* swapPairs(ListNode* head) {
		ListNode* FakeNode = new ListNode(0, head);
		ListNode* tmp1;	// 临时变量
		ListNode* tmp2;	// 临时变量
		ListNode* cur = FakeNode;	// 头结点的下一个节点
		while (cur->next != NULL && cur->next->next != NULL) {
			// 更新
			tmp1 = cur->next;			// 保存第1个节点,虚节点是第0个节点
			tmp2 = tmp1->next->next;	// 保存第3个节点
			//交换
			cur->next = tmp1->next;		
			cur->next->next = tmp1;
			tmp1->next = tmp2;
			// 更新
			cur = tmp1;
		}
		return FakeNode->next;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

三、完整代码

# include <iostream>
using namespace std;

struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int x) : val(x), next(nullptr) {}
	ListNode(int x, ListNode* next) : val(x), next(next) {}
};

class Solution {
public:
	ListNode* swapPairs(ListNode* head) {
		ListNode* FakeNode = new ListNode(0, head);
		ListNode* tmp1;	// 临时变量
		ListNode* tmp2;	// 临时变量
		ListNode* cur = FakeNode;	// 头结点的下一个节点
		while (cur->next != NULL && cur->next->next != NULL) {
			// 更新
			tmp1 = cur->next;			// 保存第1个节点,虚节点是第0个节点
			tmp2 = tmp1->next->next;	// 保存第3个节点
			//交换
			cur->next = tmp1->next;		
			cur->next->next = tmp1;
			tmp1->next = tmp2;
			// 更新
			cur = tmp1;
		}
		return FakeNode->next;
	}
};

ListNode* ChainGenerator(int arr[], int len) {
	ListNode* head = new ListNode(arr[0], NULL);
	ListNode* p = head;
	for (int i = 1; i < len; i++) {
		ListNode* pNewNode = new ListNode(arr[i], NULL);
		p->next = pNewNode; // 上一个节点指向这个新建立的节点
		p = pNewNode; // p节点指向这个新的节点
	}
	return head;
}

void my_print(ListNode* head, string str) {
	cout << str << endl;
	ListNode* cur = head;
	while (cur != NULL) {
		cout << cur->val << ' ';
		if (cur->next == NULL) break;
		cur = cur->next;
	}
	cout << endl;
}

int main()
{
	//int arr[] = { 1,2,3,4 };
	int arr[] = { 1 };
	int len = sizeof(arr) / sizeof(int);
	Solution s1;
	ListNode* head = ChainGenerator(arr, len);
	my_print(head, "目标链表:");
	head = s1.swapPairs(head);
	my_print(head, "翻转后的链表:");
	system("pause");
	return 0;
}

end

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

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

相关文章

IDL基础语法

1 创建变量 命名规则&#xff1a;变量名必须以字母开头。它们可以包括其它字母&#xff0c;数字&#xff0c;下划线&#xff0c;美元符号。 以下是创建不同数据类型的方法&#xff0c;我们只需了解即可&#xff0c;知道如何创建整型【16位有符号长整型】和浮点型 PRO learn;创…

RedisGraph的整体架构

The architecture of RedisGraph 本文关注RedisGraph的整体架构&#xff0c;分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构&#xff0c;最重要的就是其图存储模型&#xff0c;即其中的…

freeswitch 使用 silero-vad 静音拆分使用 fastasr 识别

silero-vad 在git 的评分挺高的测试好像比webrtc vad好下面测试下 silero-vad 支持c 和py 由于识别c的框架少下面使用py 以下基于python3.8torch1.12.0torchaudio 1.12.0 1.由于fastasr 需要16k 所以 将freeswitch的实时音频mediabug 8k转成16k 用socket传到py 模块代码…

二十三种设计模式(待更)

二十三种设计模式 二十三种设计模式结构型1.适配器 相关资料 二十三种设计模式 资料来源于老师讲解以及大佬的设计模式仓库 zhengqingya 结构型 将对象和类按某种布局组成更大的结构&#xff0c;并同时保持结构的灵活和⾼效。 1.适配器 将一个类的接口转换成客户希望的另外…

【小沐学Python】Python实现在线电子书(MkDocs + readthedocs + github + Markdown)

文章目录 1、简介2、安装3、创建新项目4、添加页面5、编辑导航页6、设置主题7、更改图标图标8、构建网站9、部署9.1 准备github项目9.2 注册登录Read the Docs9.3 导入github项目到 Read the Docs 10、Markdown语法10.1 横线10.2 标题10.3 段落10.4 文字高亮10.5 换行10.6 斜体…

你不可不知的八大全新顶级开源项目

导读九年来&#xff0c;Black Duck开源年度奖一直致力于发现过去一年中出现的最具创新性与影响力的开源项目。尽管开源项目阵营一直在快速变化&#xff0c;但年度新人奖一直在为行业趋势提供重要参考。下面&#xff0c;我们将了解这一年中的各位获奖新人! 九年来&#xff0c;B…

adb详细教程(一)-下载安装与环境变量配置

对于Android开发来说&#xff0c;adb是再熟悉不过的调试工具 但其实对于移动端的测试来说&#xff0c;adb也是一个十分重要的、能够提高测试工作效率的工具。 文章目录 一、介绍二、下载地址三、安装四、配置环境变量 一、介绍 全称 adb全称全称为Android Debug Bridge&#x…

【Python】在同一图形中的绘制多个子图

1. 引言 有时我们需要并排绘制两个图形&#xff0c;这不仅是为了更好地利用空间&#xff0c;而且主要是因为为了更加直观地对比分析数据。其实在python中可以利用subplot来实现上述功能。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 准备工作 这里&#xff0c;我们…

JavaScript 教程---互联网文档计划

学习目标&#xff1a; 每天记录一章笔记 学习内容&#xff1a; JavaScript 教程---互联网文档计划 笔记时间&#xff1a; 2023-6-5 --- 2023-6-11 学习产出&#xff1a; 1.入门篇 1、JavaScript 的核心语法包含部分 基本语法标准库宿主API 基本语法&#xff1a;比如操作符…

代码随想录第57天

1.回文子串 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断这个区间是不是回文 动态规划 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 如果大家做了很多这种子序列相关的题目&…

基于html+css的图展示118

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

ChatGPT对未来编程语言发展的影响与展望

目录 一、引言1.ChatGPT的介绍与背景介绍背景 2.编程语言发展的重要性和挑战重要性挑战 二、ChatGPT在编程领域的应用1.自然语言处理技术在编程中的应用现状2. ChatGPT作为编程辅助工具的潜力与优势 三、ChatGPT对编程语言发展的影响1. 创新编程模式的涌现2. 语言设计与交互方式…

【高危】GitLab CE/EE 16.0.0存在路径遍历漏洞(存在POC)

漏洞描述 GitLab 是一款基于Git的代码托管、版本控制、协作开发平台。 在 GitLab CE/EE 16.0.0版本中 &#xff0c;在文件上传时未对filename参数进行安全过滤&#xff0c;导致存在路径遍历漏洞&#xff0c;若嵌套在五个组及以上的公共项目中存在附件时&#xff0c;未经身份验…

以ChatGPT辅助软件架构工作

以ChatGPT辅助软件架构工作 在目前技术瞬息万变的背景下&#xff0c;软件建构师需要持续探索并采纳新颖的工具和方式&#xff0c;以提升开发流程&#xff0c;增强效率&#xff0c;同时保障最后成品的品质。在此之中&#xff0c;人工智能&#xff08;AI&#xff09;已经演变为一…

大数据Doris(三十八):Spark Load 导入Hive数据

文章目录 Spark Load 导入Hive数据 一、Spark Load导入Hive非分区表数据 1、在node3hive客户端&#xff0c;准备向Hive表加载的数据 2、启动Hive&#xff0c;在Hive客户端创建Hive表并加载数据 3、在Doris中创建Hive外部表 4、创建Doris表 5、创建Spark Load导入任务 6…

Windows命令行查找并kill进程及常用批处理命令汇总

Windows命令行查找并kill进程及常用命令汇总 打开命令窗口 开始—->运行—->cmd&#xff0c;或者是 windowR 组合键&#xff0c;调出命令窗口。 cmd命令行杀死Windows进程方法 1、根据进程名称批量kill 1&#xff09;、执行tasklist|more检索进程 2&#xff09;、执…

React学习之路-目录结构

目录结构 node_modules — 存放项目依赖包 public — 存放网站的静态资源文件 favicon.icon — 网站偏爱图标index.html — 主页面&#xff08;重要&#xff09;logo192.png — logo图logo512 — logo图manifest.json — 应用加壳的配置文件robots.txt — 爬…

反馈放大电路与功率放大电路(模电速成)

目录 一、反馈放大电路 1、四种基本组态 2、按反馈信号的极性来分 3、相关参数计算 4、引入电压串联负反馈 5、反馈类型判断 6、深度负反馈 二、功率放大电路 1、功率放大电路基础 2、最大输出功率问题 一、反馈放大电路 1、四种基本组态 电压串联 、电压并联、电流串…

文件隐写 笔记汇总

隐 copy命令 作用&#xff1a;copy /b 文件名1文件名2…文件名N(空一个格 )合并后的文件名 想正常浏览文件,那么就可以把合并后的文件名字的文件格式保存为第一个文件的格式(也就是你想要正常浏览的那个文件格式) 详细命令&#xff1a;cmd copy命令 文件复制 注意&#xff1a;…

华为OD机试真题 JavaScript 实现【相同数字的积木游戏1】【2023Q2 100分】

一、题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小薇找到这排积木中数字相同且所处位置最远的2块积木块&#xff0c;计算他们…