题目地址: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 ",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(" "); } if (rest != 0) { for (i = gap*k; i < n - 1; ++i) { printf("%05d %d %05d ",rev[i].addr,rev[i].data,rev[i+1].addr ); } printf("%05d %d -1 ",rev[i].addr,rev[i].data ); } } return 0; }