输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
#include<cstdio>
#include<queue>
#define maxn 100000
using namespace std;
struct NODE{
int data;
int next;
}node1[maxn],node2[maxn];
//node1是原链表,node2是反转后的链表
queue<int>e;
//存放原链表中每k个数的第一个节点的地址,也就是反转后的链表中每k个数的最后一个节点的地址
int main()
{
int start;
int n,k;
scanf("%d%d%d",&start,&n,&k);
for(int i=0;i<n;i++)
{
int address;
scanf("%d",&address);
scanf("%d%d",&node1[address].data,&node1[address].next);
}
int p=start;
if(k<=1)//如果k是0或者k是1的话直接输出原链表,没有这一步会造成测试点3错误
{
while(p!=-1)
{
if(node1[p].next!=-1)
printf("%05d %d %05d\n",p,node1[p].data,node1[p].next);
else
printf("%05d %d %d\n",p,node1[p].data,node1[p].next);
p=node1[p].next;
}
return 0;
}
n=0;
while(p!=-1)//排除无效结点,否则会造成测试点6错误
{
n++;
p=node1[p].next;
}
p=start;
int start2=start;
int first;
for(int i=0;i<n/k;i++)
{
e.push(p);
int last=-1;//p指向当前节点,last指向上一个节点
for(int m=0;m<k;m++)//把每k个数存放到新链表里
{
node2[p].data=node1[p].data;
node2[p].next=last;
last=p;
p=node1[p].next;
}
if(start2==start)
start2=last;//求出新链表的起始地址
if(i!=0)
{
node2[e.front()].next=last;
//原链表中,每k个节点的第一个节点,是每2k个节点最后一个节点的下一节点,
//所以要用队列存放,这部分不妥当会造成第5个测试点错误
e.pop();
}
}
node2[e.front()].next=p;
while(p!=-1)
{
node2[p].data=node1[p].data;
node2[p].next=node1[p].next;
p=node2[p].next;
}
p=start2;
while(p!=-1)
{
if(node2[p].next!=-1)
printf("%05d %d %05d\n",p,node2[p].data,node2[p].next);
else//注意-1不能补0
printf("%05d %d %d\n",p,node2[p].data,node2[p].next);
p=node2[p].next;
}
return 0;
}
总结:一定要注意使用静态链表的时候排除无效结点