【PAT】2-1 Reversing Linked List
时间:2015-01-30 14:36:04
收藏:0
阅读:105
题目地址:2-1
按给定的K个间隔翻转链表。给出了链表的首地址和结点个数以及间隔K,每个结点又提供了自身的地址、存储的数值以及下一个结点的地址。结点构造成一个结构体,所有结点放在结构体数组里,其中注意存储的技巧——将地址作为数组的数值下标,而数组值是数据内容以及下一个节点的地址。同时注意存在无效的结点。
手残感觉输出的时候好麻烦。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
#define read() freopen("in.txt", "r", stdin)
#define write() freopen("out.txt", "w", stdout)
#define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define cpy( a , x ) memcpy ( a , x , sizeof a )
#define max(a,b) (a>b)?(a):(b)
#define LL long long
#define MaxSize 100004
typedef struct node
{
int addr;
int data;
int next;
}Node;
Node nod[MaxSize];
Node rev[MaxSize];
int main()
{
read();
int start,n,k,rest,gap,i,j;
while(scanf("%d %d %d",&start,&n,&k)!=EOF)
{
//按照题目要求输入每个结点的地址,数据以及下一个结点的地址
//将地址作为数组的数值下标,而数组值是数据内容以及下一个节点地址
int i = 0, j = 0;
while(n--)
{
scanf("%d",&i);
nod[i].addr = i;
int a,b;
scanf("%d",&a);
nod[i].data = a;
scanf("%d",&b);
nod[i].next = b;
}
//构造单链表
for (int i = start;;)
{
rev[j].addr = nod[i].addr;
rev[j].data = nod[i].data;
j++;
i = nod[i].next;
if (i == -1)
{
break;
}
}
n = j;//更新n,处理无效结点
//每k个结点逆置
gap = n / k;
rest = n % k;
for (i = 0; i < gap; ++i)
{
for (j = (i + 1)*k - 1; j > i*k ; --j)
{
printf("%05d %d %05d\n",rev[j].addr, rev[j].data,rev[j-1].addr);
}
printf("%05d %d ",rev[j].addr,rev[j].data );
if (rest == 0)
{
if (i == gap - 1)
{
printf("-1");
}else
{
printf("%05d",rev[(i+2)*k-1].addr );
}
}else
{
if (i == gap - 1)
{
printf("%05d",rev[(i+1)*k].addr );
}else
{
printf("%05d",rev[(i+2)*k-1].addr );
}
}
printf("\n");
}
if (rest != 0)
{
for (i = gap*k; i < n - 1; ++i)
{
printf("%05d %d %05d\n",rev[i].addr,rev[i].data,rev[i+1].addr );
}
printf("%05d %d -1\n",rev[i].addr,rev[i].data );
}
}
return 0;
}
评论(0)