标签:
链接:http://www.nowcoder.com/pat/6/problem/4051
给定一个常数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 "iostream" 2 #include <iomanip> 3 #include <string.h> 4 #include <string> 5 #include <vector> 6 #include <cmath> 7 #include <cctype> 8 #include <algorithm> 9 using namespace std; 10 11 int pos[100005]; 12 int value[100005]; 13 int list[100005]; 14 int res[100005]; 15 int main() 16 { 17 int n, r, i; 18 int begin; 19 cin >>begin >>n >>r; 20 for(i=0; i<n; ++i) 21 { 22 int x; 23 cin >>x; 24 cin >>value[x] >>pos[x] ; 25 } 26 int k=0; 27 while(begin != -1) 28 { 29 list[k] = begin; 30 res[k++] = begin; 31 begin = pos[begin]; 32 } 33 for(int i=0; i<(k-(k%r)); ++i) //这个需要理解 34 { 35 res[i] = list[(i/r)*r+r-(i%r)-1]; //这个需要理解 36 } 37 for(int i=0; i<k-1; ++i) 38 { 39 cout <<setiosflags(ios::right) <<setfill(‘0‘) <<setw(5) <<res[i] <<" "; 40 cout <<value[res[i]] <<" "; 41 cout <<setiosflags(ios::right) <<setfill(‘0‘) <<setw(5)<<res[i+1] <<endl; 42 } 43 cout <<setiosflags(ios::right) <<setfill(‘0‘) <<setw(5)<<res[k-1] <<" " <<value[res[k-1]] <<" " <<-1 <<endl; 44 return 0; 45 }
标签:
原文地址:http://www.cnblogs.com/mtc-dyc/p/4622180.html