【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 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;
   
}

  

  

原文地址:https://www.cnblogs.com/acmsummer/p/4253214.html