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

      

      

  • 相关阅读:
    c++ set unordered_set区别
    LeetCode 213. 打家劫舍 II
    LeetCode 152. 乘积最大子序列
    [HAOI 2012] 外星人
    [HAOI 2016] 找相同字符
    [ZJOI2007] 仓库建设
    [SCOI 2016] 美味
    [BZOJ 2127] Happiness
    [NOI2009] 植物大战僵尸
    [SDOI 2016] 数字配对
  • 原文地址:https://www.cnblogs.com/acmsummer/p/4253214.html
Copyright © 2020-2023  润新知