这题相对来说坑大一些,而且理解起来有丶难度。
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);