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

      

      

  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/acmsummer/p/4253214.html
Copyright © 2020-2023  润新知