C++ 单链表节点交换

2023-10-27

  这里提供两种方法,一种是只交换对应的数据,另一种是通过更改指针来交换节点。而更改指针中又可以分为新建节点与不新建节点的方法。

1.不更改指针

这个没啥好说的,直接将对应的data交换即可。(这里的a,c节点都为被交换节点的上一个节点。因为不更改指针所以遍历到被交换节点即a->next和c->next也可以)

void List::swap(Node* a, Node* c)
{
	int tmp;
	tmp = a->next->data;
	a->next->data = c->next->data;
	c->next->data = tmp;
}

2.更改指针

更改指针又可以分为新建节点和不新建节点的方法。

①新建节点

新建节点去保存被交换节点的值,再将其插入到单链表中。相当于删去原先单链表中的两个节点,再将它们插入到对应位置。(这里的a,b节点都为被交换节点的上一个节点。但这里由于需要改变被交换节点的上一个节点的next指针,使next指向你新建的节点,那么就不能遍历到被交换节点。同时不要忘了你新建的节点的next需要指向被交换节点的下一个节点)

void List::swap(Node* a, Node* b)
{
	Node* c = new Node();
	Node* d = new Node();
	c->data = a->next->data;
	d->data = b->next->data;
	d->next = a->next->next;
	c->next = b->next->next;
	a->next = d;
	b->next = c;
}

②不新建节点

这个可能有点难理解,这里的a,c节点仍然为被交换节点的上一个节点。接下来我们来分析分析这段代码。

void List::swap(Node* a, Node* c)
{
	Node* b = a->next;
	Node* d = c->next;

	a->next = d->next;
	c->next = b->next;
	b->next = a->next;
	d->next = c->next;
	a->next = d;
	c->next = b;
}

我们需要保存两个被交换节点,同时需要改变其上一个节点的next指针等。那么新建b和d来保存被交换节点。

    Node* b = a->next;
    Node* d = c->next;

   难点主要在这下面这块

a->next = d->next;
c->next = b->next;

b->next = a->next;
d->next = c->next;

a->next = d;

c->next = b;

   这里拿图中这个单链表解释。假设我们需要交换第1个节点与第四个节点,括号内的字母为对应指针所在位置。

Head(a) 11(b) 22 33(c) 44(d) 55 NULL

  大致思路很简单,想办法把被交换节点b后面的节点(一直到c)接到d的后面,把d之后的节点(直到为NULL)接到b的后面。

  那不如单独取出两个节点,将上面两部分的节点分别接到这两个节点之后,再拼接到被交换节点之后不就好了吗。这里用被交换节点的前一个节点来保存对应被交换节点之后的节点。

a->next = d->next;
c->next = b->next;

head

 (a)

55

33

(c)

22

(b->next)

33 22 ...(此时c被包含于b->next...->next中,所以循环)

 再将对应节点拼接到被交换节点后

b->next = a->next;
d->next = c->next;

head

(a)

11

(b)

55

(a->next)

44

(d)

22

33

(c->next)

22

...(22,33循环)

  最后合并,得到交换后的链表,完成

a->next = d;

c->next = b;

head 44 22

33

(c->next)

22 ...(22,33循环)
Head(a) 11(b) 22 33(c) 44(d) 55 NULL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 单链表节点交换 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • iframe如何发送请求_Vue 中使用 Iframe 踩坑记

    背景 创业项目使用的 Vue 开发前端 最近在开发的一个需求涉及到了 Iframe 的使用 为了让父子页面能够正常通信 头都搞大了 不过最终是解决了问题 写篇文章记录下 利人利己 难点 之前没有在 Vue 中使用过 Iframe 网上的相关
  • 【环境搭建】Docker上搭建sqli-labs漏洞环境

    目录 1 sqli labs简介 2 Docker搭建sqli labs 3 总结 参考文献 1 sqli labs简介 sq Ii labs是一款学习SQL注入的开源平台 共有75种不同类型的注入 官方介绍如下 SQLI LABS is
  • 基于VMD-SSA-LSTM的多维时序光伏功率预测

    目录 1 主要内容 变分模态分解 VMD 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测 核心部分复现 该程序预测效果比较好 并
  • RT-Thread uart2串口dma idle接收不断帧

    硬件STM32F407 IDE使用RT Thread Studio uart2串口使用这两个引脚 功能 IO端口 UART2 TX PA2 UART2 RX PA3 UART2 DMA接收配置 先使能DMA接收 RX缓冲区可以稍微调大些 b
  • Vuetify笔记(5):data-tables组件

    v data table 用于显示表格数据 功能包括排序 搜索 分页 行内编辑 头部提示以及行选择 而我们在实际应用中使用最多的就是服务端分页和排序 如果你从后台加载数据 并希望显示结果之前进行分页和排序 你可以使用 total items
  • 对象的构造和析构

    对象的构造和析构 1 对象的初始化和清理 构造函数 和 析构函数 被编译器自动调用完成对象初始化和对象清理工作 2 构造函数 和 析构函数 构造函数写法 与类名相同 没有返回值 不写void 可以有参数 可以发生重载 构造函数由编译器自动调
  • 神经网络学习——图像篡改

    记录 这是课堂上做的一个关于图像篡改识别的题目 因为前后花的时间比较多 虽然最后实现的效果也不怎么行 但是这个过程踩了很多坑 这里记录一下 文章目录 记录 前提 题目分析 网络搭建 依赖包 数据读取处理 网络搭建 训练参数 预测函数 模型保
  • linux——read和write函数实现cp、用户级缓冲预读入缓冲的简单认识

    用read和write实现cp 1 注意头文件 2 fd1是源文件 传入参数中的第一个 fd2是目标文件 传入参数中的第二个 要写入的文件至少可写 如果没有当前文件就创建文件并设置权限 如果已经有文件就截断为0再重新写 3 定义一个缓冲区
  • vue2和vue3的响应式原理

    vue2和vue3的响应式原理 vue2 的响应式 vue3 的响应式 vue2 的响应式 使用 Object 构造函数上 defineProperty 实现 存在的问题 对象 新增的属性没有响应式 数组 部分操作没有响应式 解决办法 1
  • [推荐系统] 1. 深度学习与推荐系统

    文章目录 1 推荐系统 1 1 推荐系统的作用和意义 1 2 推荐系统架构 1 2 1 推荐系统的逻辑架构 1 2 2 推荐系统的技术架构 2 前置知识 2 1 传统推荐模型的演化 2 2 协同过滤 2 2 1 概述 2 2 2 用户相似度
  • uniapp nfc读写

    1 先添加权限
  • MySQL中show语法

    1 show tables或show tables from database name 显示当前数据库中所有表的名称 2 show databases 显示mysql中所有数据库的名称 3 show columns from table
  • Git Rebase与Merge

    在 Git 中整合来自不同分支的修改主要有两种方法 merge 以及 rebase 两种观点 有一种观点认为 仓库的提交历史即是记录实际发生过什么 它是针对历史的文档 本身就有价值 不能乱改 从这个角度看来 改变提交历史是一种亵渎 你使用
  • [Android]系统启动时序

    最近公司的群里面有大佬分享了一张自己总结的系统启动时序 觉得画的非常清晰简练 因此在这里分享一下
  • I - Intense Bit Wheel (二进制,bitset)

    SDUT 2022 Summer Individual Contest 2 for 21 Virtual Judge There is a new intense giant wheel in UNAL town in UNAL town
  • uniapp整包apk更新下载后安装完删除下载的apk,避免占用app内存

    一 内存大 app版本更新后内存变的好大 更新多几次版本更大 小编便发现是每次更新后都把下载下来的apk大小增加到app里面去了 那么我们如何版本更新完之后删除下载下来的apk文件呢 避免占用内存 二 解决方案 使用html5 功能IO模块
  • NLP预训练模型-GPT-3

    NLP预训练模型 系列文章 1 BERT 2 GPT 3 GPT 2 4 GPT 3 目录 NLP预训练模型系列文章 文章目录 前言 1 Abstract 2 Introduction 3 Approach 3 1 模型和架构 3 2 训练
  • oracle11g 导出表报EXP-00011:table不存在。

    转自 https blog csdn net mingzaiwang article details 52608991 depth 1 utm source distribute pc relevant none task utm sour
  • 8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法

    8种提升程序猿编程能力的方法 对于程序员来说 提高自己的编程能力 算是给自己定的职业发展目标之一 不过定一个成为编程大神的目标很容易 具体做起来可能就不是一件简单的事了 首先 既然决定 我要变得更好 得先知道 更好 是什么样子的 另外 不能
  • C++ 单链表节点交换

    这里提供两种方法 一种是只交换对应的数据 另一种是通过更改指针来交换节点 而更改指针中又可以分为新建节点与不新建节点的方法 1 不更改指针 这个没啥好说的 直接将对应的data交换即可 这里的a c节点都为被交换节点的上一个节点 因为不更改