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

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

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

  • 相关阅读:
    iOS 之 内存管理
    php的异步并行扩展swoole
    如何用php实现qq登陆网站
    php分页类
    php的分页代码
    一个小的投票系统
    php如何判断两个时间戳是一天
    PHP中出现Notice: Undefined index的三种解决办法
    vmvare如何安装xp虚拟机
    windows2003安装
  • 原文地址:https://www.cnblogs.com/buanxu/p/12813370.html
Copyright © 2020-2023  润新知