码迷,mamicode.com
首页 > 其他好文 > 详细

B1025. 反转链表 (25) A1074

时间:2015-03-04 22:28:10      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

给定一个常数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 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <iostream>
 4 #include <string.h>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <string>
 8 #include <stack> 
 9 #include <queue>
10 using namespace std;
11 const int maxn=100010;
12 struct Node{
13     int data;
14     int address;
15     int next;
16     int order;
17 }node[maxn];
18 
19 bool cmp(Node a,Node b)
20 {
21     if(a.order==-1||b.order==-1)
22     return a.order>b.order;
23     else{
24         return a.order<b.order;
25     }
26 }
27 
28 int main(){
29     for(int i=0;i<maxn;i++)
30     {
31         node[i].order=-1;//顺序都为负 
32     }
33     int begin,n,k,address;
34     scanf("%d %d %d",&begin,&n,&k);
35     for(int i=0;i<n;i++)
36     {
37         scanf("%d",&address);
38         scanf("%d %d",&node[address].data,&node[address].next);
39         node[address].address=address;
40     }
41     
42     int p=begin,count=0;
43     while(p!=-1)//遍历得有效节点 
44     {
45         node[p].order=count++;
46         p=node[p].next;
47     }
48     sort(node,node+maxn,cmp); 
49     //
50     n=count;
51     //单链表排序完毕 开始输出
52     for(int i=0;i<n/k;i++)
53     {
54         //最后一块不一定完整
55         //逆向输出 
56          for(int j=(i+1)*k-1;j>i*k;j--)
57          {
58              printf("%05d %d %05d\n",node[j].address,node[j].data,node[j-1].address);
59          }
60          //每块最后一个点 
61          printf("%05d %d ",node[i*k].address,node[i*k].data) ;
62          if(i<n/k-1)
63          {
64              printf("%05d\n",node[i*k+2*k-1].address);
65          }else
66          {
67              if(n%k==0)printf("-1\n");
68              else
69              {
70                  printf("%05d\n",node[(i+1)*k].address);
71                  //多余节点按序输出
72                 for(int j=(i+1)*k;j<n;j++)
73                 {
74                     printf("%05d %d ",node[j].address,node[j].data) ;
75                     if(j==n-1)printf("-1\n");
76                     else
77                     printf("%05d\n",node[j+1].address);
78                 } 
79                 
80              }
81          }
82     }
83     return 0;
84 }

 

B1025. 反转链表 (25) A1074

标签:

原文地址:http://www.cnblogs.com/ligen/p/4314333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!