链表进阶操作一:调换相邻节点的位置 以及 让节点所有奇偶位置互换(图文演示,通俗易懂)

C语言实现链表基本操作(交换第i个和第j个节点) #include <stdio.h> #include <malloc.h> typedef struct node { char ID[20]; int Score; struct node * Next; }Node, * List; void Insert(List *L, Node e) { List temp = *L; List n = (List)malloc(sizeof(Node)); n->Score = 阅读详情

关于链表有很多可以实现的操作,接下来讲讲一些关于链表的进阶操作。

我们先来讲讲相邻节点是如何调换的

一、先创建一条链表

直接上代码(不知道如何创建链表的同学可以看看我上一篇文章)

//需要的两个头文件
#include<stdio.h>
#include<stdlib.h>

//定义结构体(包含指针域和数据域)
typedef struct Node
{
	int data;
	struct Node *next;
 } Node;
 
 
 int main()
 {
 	Node *p1,*p2;      //定义两个指针进行各种操作(可看我的上一篇文章)
 	Node *head;       //定义head指针标记头结点

	int x; 	
 	head = NULL;
 	
 	
 	printf("请输入创建多少个链表:"); 
 	scanf("%d",&x);
 	
// 	创建链表节点并连接 
	for(int i=1;i<=x;i++)
 	{
 		p1 = (Node *)malloc(sizeof (Node));
 		if(head == NULL)
			{
		 		head = p1;
		 		p2 = p1;
			}
		else
		{
			p2->next =p1;
			p2 = p1;
		}
	}
	
	p2->next = NULL;    //把尾结点标记为NULL
	p = head;

此时该链表图为:

在这里插入图片描述

链表的顺序已经是固定的了。要想实现调换链表中临近节点的位置,如调换2和3节点,我们该如何做呢?如何用两个指针实现呢?

二、先试着调换第2、第3节点的位置

调换后的位置为1→3→2→4→…即我们需要把1节点指向3的位置,2节点指向4的位置,然后2,3节点反转一下,就实现了2,3节点调换。

操作如图:
在这里插入图片描述

貌似这图也不是很直观。。要是没看懂还是需要自己画图多想想,其实就是1→2→3→4变成1→3→2→4

直接上代码:

为方便理解,我们先定义三个指针*p,*p1,*p2分别指向1,2,3的位置
即:p = head;
	p1 = p->next;
	p2 = p1->next;
调换位置的操作:
	p->next = p2;                1指向3的位置
	p1->next = p2->next;         2指向4的位置
	p2->next = p1;               3又指向2的位置
	

三、输入输出数据,检测操作是否正确

输入数据
	int q=1;
	while (p != NULL)
	{
		p->data = q;
		q++;
		printf("%d ",p->data);
		p = p->next;
	 } 
	
	printf("\n");
输出数据:
	p = head;
	
	while (p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	 } 

运行结果:


请输入创建多少个链表:4
1 2 3 4
1 3 2 4
--------------------------------
Process exited after 4.014 seconds with return value 0
请按任意键继续. . .

调换2,3位置的操作成功了

如何实现链表中所有节点奇数和偶数的位置互换呢?

这是室友的一道题,大概就是实现1和2的位置互换,3和4的位置互换,我研究了半小时,想发出来给大家分享一下想法。

讲讲我的思路

其实就是我刚刚讲的那个相邻位置互换的进阶操作。多加一个循环来实现就可以。定义三个指针的好处就是,p指针来标记位置,p1和p2用来实现调换位置的功能。

由于上面所讲可以看出,要想调换两个节点的位置,我们至少需要知道调换节点的前一个的位置。也就是说,要想调换2,3节点的位置,必须要知道1节点的位置,否则,1节点无法指向3节点的位置致使操作失败。

注意:只要调换1,2节点的位置时不需要标记前一个节点的位置,所以我们要进行特殊化处理(先调换这两个的位置)

一、先调换1,2节点的位置

代码如下: 
	p1=head;                 p1指向1 节点的位置 
 	p2=head->next;           p2指向2 节点的位置
 	
 			
	head=p2;                 因为2节点要变成头结点,所以p2标记为head
 	p1->next = p2->next;     1指向3
 	p2->next = p1;           2指向1

	已经完成了1,2节点位置的调换

二、设计循环 调换之后节点的位置

我们发现,p节点需要标记偶数节点的位置。即,调换3,4要标记2节点,调换5,6要标记4节点。

由于始终为p1从奇数变为偶数。所以只需要在调换完成后用p来标记p1的位置即可。

直接上代码:

调换:

p = p1;                              标记上一次调换完成后p1的位置


for(a=1;a<=(x/2)-1;a++)              for循环语句,由于已经调换了1,2,所以循环次数-1
{
	p1 = p->next;                    
	p2 = p1->next;                   p→p1→p2           
	
	p->next = p2;                   
	p1->next = p2->next;             进行调换奇数偶数节点的调换
	p2->next = p1;
	
	p=p1;                            标记调换完成后p1的位置
}

三、输出链表的数据,检测操作是否正确

代码如下:

	p = head;
	
	
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	

运行结果:


请输入创建多少个链表:9
反转前:1 2 3 4 5 6 7 8 9
反转后:2 1 4 3 6 5 8 7 9
--------------------------------
Process exited after 2.78 seconds with return value 0
请按任意键继续. . .

以后会不定时更新进阶操作的哦,希望大家可以点个赞,点个关注收藏~
大家有啥问题可以一起讨论哦,谢谢观看

为什么idea已经改了UTF-8还是乱码,如何解决? 🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀! 阅读详情

相关推荐

【面试经验】大疆笔试-计算机视觉算法B卷

3、a=np.random.randn(3,3) b=np.random.randn(3,1) ,那么c=a*b的维度应该是:*是元素乘法或者torch.mul,@才是矩阵乘法或者torch.matmul,不会触发广播机制;8、将分辨率降低一半时,精标定内参(fx、fy、cx、cy、k1、k2、k3)焦距、光心、畸变系数将分别变成(fx、fy、cx/2、cy/2、k1、k2、k3),只能搜到光心变成一半,畸变系数不变。12、KLT算法在频闪光源、重复纹理、高速机动、环境照度低的情况下效果显著下降。

litterfinger的博客 1444

算法:链表交换相邻节点

力扣编号:24 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:head = [1] 输出:[1] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs 解题思路..

u011157113的博客 1912

《Mac 配置 Codex App 代理完整指南:端口检测 + launchctl 设置 + 取消代理》

本文详细介绍 Mac 上 Codex App 代理配置完整流程,包括如何查看代理端口、如何使用 launchctl 设置 HTTP_PROXY / HTTPS_PROXY、如何验证代理是否生效以及如何取消代理配置。适用于 Mac Codex 代理、Mac HTTP_PROXY 设置、Mac ChatGPT 代理等开发环境场景。

weixin_50029578的博客 5335

【链表*】交换结点

只要涉及到链表结点的删除或交换,就必须新建虚拟头结点newHead->next=head,让f指针指向newHead作为前置结点指针(删除和交换都需要前置结点指针的),newHead当然不动,程序最后返回的是newHead->next。 两个两个地交换结点 两个两个地就地交换结点。 大致思路: 一定要先新建一个虚拟结点newHead,newHead->nex...

It's the Climb 6304

S7-1200与KINCO伺服通信实战:CM CANopen模块配置避坑指南(附完整PDO映射表)

本文详细解析了西门子S7-1200 PLC通过CM CANopen模块与KINCO伺服驱动器的通信配置全流程,重点解决PDO映射混乱、心跳报文配置错误等常见问题。提供硬件组态、参数设置、PDO映射模板及故障排查方案,助力工业自动化系统实现稳定高效的多轴运动控制。

2y3u4i5o6p的博客 1100

手把手教你用Apple Developer App完成苹果开发者账号注册(含证件验证失败解决方案)

本文详细指导如何通过Apple Developer App完成苹果开发者账号注册,特别针对证件验证失败问题提供解决方案。从准备工作到注册流程,再到验证失败的处理方法,帮助开发者顺利完成注册,避免常见错误。

moss5的博客 1156

链表——24. 两两交换链表中的节点

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

想着百万年薪努力的小赵 2730

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 205

顺序表应用3:元素位置互换之移位算法

顺序表应用3:元素位置互换之移位算法 Description 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),借助元素移位的方式,设计一个空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段。 注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能用一个循环语句实现,不能分成两个部分。 Inp

baiqiaoxiang的博客 247

保姆级教程:用R包ggpicrust2搞定PICRUSt2功能预测,从差异分析到热图PCA一键出图

本文提供了一份详细的ggpicrust2使用指南,帮助用户从零开始完成PICRUSt2功能预测数据的差异分析和可视化。通过安装配置、数据导入、差异分析到高级可视化(如热图和PCA)的全流程讲解,即使是初学者也能快速掌握发表级图表的生成技巧。

weixin_33712987的博客 384

【LLM评估篇】Ceval | GAIA | MMLU benchmarks

- 一些大模型的评估模型: - 多轮:MTBench - 关注评估:agent bench - 长文本评估:longbench,longeval - 工具调用评估:toolbench - 安全评估:cvalue,safetyprompt等 本文还介绍了其他主流的大模型评估指标等及其使用

发现问题,并解决问题,批判性思维 6945

TreeMap 详解

TreeMap 是 Java 中的一种集合类,它实现了 SortedMap 接口,可以根据键的自然顺序或者自定义顺序对元素进行排序,底层实现采用了红黑树(Red-Black Tree)的数据结构。TreeMap 中的元素是按照键的排序顺序存储的,可以高效地进行查找、插入和删除操作。

gycaaa的博客 5531

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6391

两两交换链表中的节点

这一步是递归的核心:我们通过递归调用 `swapPairs(next.next)` 来处理下一个节点的交换。` 最后,返回 `next`,它成为交换后的当前对的头节点(即在交换后,原先的第二个节点现在成为了这一对的前端节点)。` 这一步将 `next` 节点指向当前的 `head` 节点,因此这两个节点完成了交换。- 将 `2 -> (4 -> 3)` 连接,返回 `2 -> 1 -> (4 -> 3)`- 处理 `4 -> 3` 进行交换,最终返回 `4 -> 3 -> null`

weixin_68049050的博客 1359

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

算法_交换链表中的节点

给定⼀个链表,两两交换其中相邻的节点(不交叉),并返回交换后的链表。你不能只是单纯的改变节点内部的值,⽽是需要。原链表:1->2->3->4输出链表:2->1->4->3。

weixin_55955132的博客 728

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

AcWing 136. 邻值查找 Java Treemap应用

的数开始处理,往前找,找到与它的差的绝对值最小的数和它的下标,如果同时有好几个数满足差的绝对值最小,那么找这个数本身最小的。这里我们长期需要维护,或者说,给你一个数,你要找到比它小的数中最大的数,和比它大的数中最小的数,也就是它的邻近值。啊哦,结果发现TLE了,因为给你的数据量非常大,会有很多次的输出,规模大概在。,可以轻松实现对临界值的维护。这时候尝试着优化一下输出试试。题意是给你一个序列,标号从。OK,过了所有的样例。

Alkali!的博客 344

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TreeSet和TreeMap解读

TreeSet和TreeMap

boilll的博客 1075

交换相邻元素

交换相邻元素 给定一个长度为 n 的数组 a1,a2,…,an。 该数组是一个 1∼n 的排列。 数组的前 n−1 个位置中,部分位置可以进行交换操作,将该位置的元素与后面相邻位置的元素进行互换。 交换操作的次序和次数均不限。 请你判断给定的数组能否通过交换操作变为一个升序数组。 输入格式 第一行包含整数 n。 第二行包含 n 个整数 a1,a2,…,an。 第三行包含一个长度为 n−1 的 01 字符串,第 i 个字符为 1 表示第 i 个位置可以进行交换操作,第 i 个字符为 0 表示第 i 个位置无法

qcy的博客 2238

java android 将 List中元素互换位置

很多时候我要对List中的元素调换位置,这时候可以用如下代码,意思是将data中的index1与index2元素互换位置 //data 为List Collections.swap(data,index1,index2);

yedajiang44的博客 1万+

如何实现map相邻两两元素之间的遍历

map相邻元素两两操作的实现。

不积跬步无以至千里 1487

链表中奇数位和偶数位的置换

1. 题目描述 两两交换链表中的节点 2. 题目分析 1.链表如下所示: 2. 建立一个root结点,并建立两个结点指针,如图所示: 注意:这里的0结点,是JAVA建立root结点是附带的:ListNode root = new ListNode(0); 3. 思路如下: 将p1.next连接到p2.next(0----->2),如下: 将p2.next连接到p1.next.next...

爱敲代码的小黄 1614

交换链表的奇偶节点

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。

BIGwangg的博客 1308

leecode328. 奇偶链表

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。 请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。 你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。 示例 1: 输入: head = [1,2,3,4,5] 输出:[1,3,5,2,4] 示例 2: 输入: head = [2,1,3,5,6,4,7] 输出: [.

liuhongtaowxp1的博客 452

单链表节点交换

输入一个单链表,将奇数位置上的节点与偶数位置上的节点进行交换,然后输出交换之后的链表。 输入格式 第一行包含整数n,表示节点数量。 第二行包含n个整数,表示每个节点的值。 输出格式 共一行,输出交换后的链表。 数据范围 1≤n≤100, 节点取值范围[1,100]。 输入样例: 5 1 2 3 4 5 输出样例: 2 1 4 3 5 Code: #include <iostream> #include <stdio.h> using na...

qq_62343171的博客 2992

数据结构-反转链表问题

一、反转链表 对于这样的链表,进行反转,我们首先考虑用两个指针的方法 此时,我们令p1=head;p1->next=p2; 然后,我们试着去反转的时候,令p1->next=NULL;p2->next=p1;可是在这个时候,p2->next指向了p1,找不到下一个节点了,也就是说,链子在这里断掉了,而如果想让链子不断,我们可以想到,定义一个p3,使p3等于p2->next,这样,我们可以令p1=p2;p2=p3;而p3本来就连接着后面的节点,令p3=p3...

m0_66654161的博客 618

leetcode——链表,两两交换其中相邻的节点

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

n9102的博客 597
上一篇: (C语言)链表详解 附带代码演示(通俗易懂)
下一篇: 用java,jsp实现分页操作(图文详解,通俗易懂)
清烟风雨
博客等级 码龄6年 21粉丝 5原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值