北邮2019计导下 链表一 D. 实验11_13_链表交换

本文详细介绍了如何处理链表中两段指定区域的交换问题。首先,从理解链表结构入手,分析交换过程中的关键步骤:更新前驱节点、修改节点域以及处理特殊情况。接着,提供了一个实现思路,包括设计index函数获取指定下标节点地址以及exchangeSection函数来执行交换操作。在实际操作中,需要注意自然下标与程序中0-based计数的区别、头结点的处理、相邻情况以及保存T2的后继节点等细节。最后,给出了一个示例输入和输出,展示链表交换后的效果。
摘要由CSDN通过智能技术生成

这题相对来说坑大一些,而且理解起来有丶难度。

1.理解

灵魂画师上线(可以自己动手画一画)
在这里插入图片描述
很普通的链表
在这里插入图片描述
原来的遍历顺序
或者说是这样
在这里插入图片描述
交换后
顺序就成了这样
在这里插入图片描述

所以总结起来,对于general situation,我们要做的的是
1.把S1的前驱prevS1节点的节点域改成S2,用来在第一段后执行紫色段。
2.把T2的节点域改成T1的节点域,用来在紫色段执行完后执行中间的白色段
3.把原S2的前驱prevS2节点的节点域改成S1,用来在白色段执行完后执行黄色段
4.把T1的节点域改成原T2的节点域(*之后会再提),用来执行第五段。

实现

设计index函数,用于直接返回某个给定下标的地址
exchangeSection函数是具体的实现形式,然后按照理解部分来做。

尬点

1.题目中给定的下标是自然下标,也就是从1开始计数的,一般程序习惯从0开始计数。
2.头结点的处理:如果S1是头结点(实际上给定的测试数据就是这种情况),需要更改头结点的位置
3.相邻情况的处理,此时会发现原来general situation的处理不再适用,会产生环链表,反映在OJ里就是OLE。(Output Length Exceeded),因为程序一直在打印。
4.T2的后继需要预先保存下来,因为根据步骤,在第二步时T2的节点域就被重新赋值而丢失了,之后赋给T1的节点域时还要用。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
   
	int data;
	struct _node* nextPtr;
} Node;

Node* createList();
void destoryList(Node** sPtr);
void exchangeSection(Node **sPtr,int s1,int t1,int s2,int t2);
void printList(Node **sPtr);
Node* index(Node **sPtr,int n);

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值