用数组实现子链表的逆转。思路举个例子,假如一共有7个结点,其中每三个结点要逆转一次。下面是图示:
如果测试数据中有无效结点的话,在程序中要写一个循环来记录有效的结点数N 。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100000
int main()
{
int Data[MaxSize];
int NextAddress[MaxSize];
int FAddress,N,K,i,j,P,Num,n,sub1,sub2,sum;
scanf("%d %d %d",&FAddress,&N,&K);
int Mem[MaxSize];
for(i=0;i<N;++i)//读入所有数据
{
int tmpAddress,tmpData,tmpNext;
scanf("%d %d %d",&tmpAddress,&tmpData,&tmpNext);
Data[tmpAddress] = tmpData; NextAddress[tmpAddress] = tmpNext;
}
P = FAddress;
sum = 0;
while(P)//记录有效结点的个数
{
sum++;
P = NextAddress[P];
}
P = FAddress;N = sum;
for(i=1;i<=N;++i)
{
Mem[i] = P;
P = NextAddress[P];
}//记录所有的地址
n = N/K;
for(i=1;i<=n;++i)//在每个区间内进行翻转
{
Num = i*K;
for(j=1;j<=K-1;++j)
{
NextAddress[Mem[Num]] = Mem[Num-1];
Num--;
}
}
for(i=1;i<n;++i)//将每个区间连接起来
{
sub1 = (i-1)*K+1;sub2 = i*K+K;
NextAddress[Mem[sub1]] = Mem[sub2];
}
if(N%K)//将倒数第一个区间和最后一个区间连接
NextAddress[Mem[(n-1)*K+1]] = Mem[N-N%K+1];
else
NextAddress[Mem[(n-1)*K+1]] = -1;
P = Mem[K];
while(NextAddress[P]!=-1)//输出
{
printf("%05d %d %05d\n",P,Data[P],NextAddress[P]);
P = NextAddress[P];
}
printf("%05d %d %d\n",P,Data[P],NextAddress[P]);
return 0;
}