首页 > 代码库 > 【PAT】2-1 Reversing Linked List
【PAT】2-1 Reversing Linked List
题目地址: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 100004typedef 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 = http://www.mamicode.com/a;"%d",&b); nod[i].next = b; } //构造单链表 for (int i = start;;) { rev[j].addr = nod[i].addr; rev[j].data = http://www.mamicode.com/nod[i].data;"%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; }
【PAT】2-1 Reversing Linked List
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。