反转链表

链接: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 }

 

posted @ 2015-07-05 15:13  皮蛋儿丶  阅读(182)  评论(0编辑  收藏  举报