zoukankan      html  css  js  c++  java
  • 1025 反转链表

    1025 反转链表 (25分)
     

    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最

    后不到 K 个元素不反转。

    输入格式:

    每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (105​​)、以及正整数 K (N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 1 表示。

    接下来有 N 行,每行格式为:

    Address Data Next
    
     

    其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

    输出格式:

    对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

    输入样例:

    00100 6 4
    00000 4 99999
    00100 1 12309
    68237 6 -1
    33218 3 00000
    99999 5 68237
    12309 2 33218
    
     

    输出样例:

    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1

        我觉得这道题的思路还是很清晰的,就不再赘述了,具体的可以看代码注释,写的比较详细。但是就是有两个测试点通不过,不晓得问题出在哪了,

    另外注意一点,就是由于末尾元素是没有后继的,它以-1结束,但是在输入的时候,可能在输入了末尾元素后还继续输入元素,这个时候就要先把他们

    过滤掉,然后再串起来,下面的测试用例就是针对的这种情况,测试用例如下:

    00001 5 3
    00001 1 00002
    00002 2 00003
    00003 3 00004
    00004 4 -1
    99999 5 12345

        附上代码

     1 #include<cstdio>
     2 #include<map>
     3 #include<vector>
     4 using namespace std;
     5 struct Node{
     6     int address,data,next;
     7 };
     8 int main() 
     9 {
    10     int first,N,K,tem;
    11     Node node;
    12     map<int,Node> mp;
    13     vector<Node> v;
    14     scanf("%d %d %d",&first,&N,&K);
    15     while(N--){    //输入每个结点,让每个结点的地址做关键字,数字和后继做key的值
    16         scanf("%d %d %d",&node.address,&node.data,&node.next);
    17         mp[node.address]=node;
    18     }
    19     tem=first;
    20     do{    //把输入的数据串成单链表
    21         v.push_back(mp[tem]);
    22         tem=mp[tem].next;    
    23     }while(tem!=-1);     //遇到 -1就是最后一个元素,结束,防止输入无效结点
    24     int len=v.size(),begin,end,i;
    25     for(begin=0,end=K-1;len>=K&&end<v.size();len-=K){    //K小于等于当前链表长度,可以反转
    26         for(i=end;i>=begin;i--){   //反转输出
    27             if(i==begin&&v[end].next!=-1){   //begin结点的前驱为end结点,end不是链表中的末尾元素
    28                 printf("%05d %d %05d
    ",v[i].address,v[i].data,v[end].next);
    29                 break;
    30             }
    31             if(i==begin&&v[end].next==-1){   //begin结点的前驱为end结点,并且end是链表中的末尾元素
    32                 printf("%05d %d %d
    ",v[i].address,v[i].data,v[end].next);
    33                 break;
    34             }
    35             printf("%05d %d %05d
    ",v[i].address,v[i].data,v[i-1].address);
    36         }
    37         begin=end+1;  //下一次的反转区间
    38         end+=K;
    39     }
    40     if(K>len&&len!=0){   //K大于当前所剩下的链表长度,不能反转,直接输出
    41         for(i=begin;i<v.size()-1;i++)
    42             printf("%05d %d %05d
    ",v[i].address,v[i].data,v[i].next);
    43         printf("%05d %d %d
    ",v[i].address,v[i].data,v[i].next);
    44     }
    45     return 0;
    46 }

        有两个测试点错误,结果如下

         如果有大佬看出哪里有错误,欢迎指出!谢谢!

  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/buanxu/p/12813370.html
Copyright © 2011-2022 走看看