PAT_A1074#Reversing Linked List

Source:

PAT A1074 Reversing Linked List (25 分)

Description:

Given a constant K and a singly linked list L, you are supposed to reverse the links of every Kelements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤) which is the total number of nodes, and a positive K (≤) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

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

Sample Output:

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

Keys:

  • 栈和队列

Attention:

  • vector<int> ans.insert(ans.begin()+pos,x);

Code:

 1 #include<cstdio>
 2 #include<stack>
 3 #include<vector>
 4 using namespace std;
 5 const int M=1e5+10;
 6 struct node
 7 {
 8     int data;
 9     int addr,next;
10 }link[M];
11 
12 int main()
13 {
14 #ifdef ONLINE_JUDGE
15 #else
16     freopen("Test.txt", "r", stdin);
17 #endif // ONLINE_JUDGE
18 
19     int first,n,k,address;
20     scanf("%d%d%d", &first,&n,&k);
21     for(int i=0; i<n; i++)
22     {
23         scanf("%d", &address);
24         link[address].addr=address;
25         scanf("%d%d", &link[address].data,&link[address].next);
26     }
27     int pos=0;
28     stack<int> re;
29     vector<int> ans;
30     while(first != -1)
31     {
32         re.push(first);
33         if(++pos == k)
34         {
35             pos=0;
36             while(!re.empty())
37             {
38                 ans.push_back(re.top());
39                 re.pop();
40             }
41         }
42         first = link[first].next;
43     }
44     int len=ans.size();
45     while(!re.empty())
46     {
47         ans.insert(ans.begin()+len,re.top());
48         re.pop();
49     }
50     for(int i=0; i<ans.size(); i++)
51     {
52         if(i!=0)
53             printf("%05d\n", ans[i]);
54         printf("%05d %d ", ans[i],link[ans[i]].data);
55     }
56     printf("-1");
57 
58     return 0;
59 }

 

posted @ 2019-08-29 20:07  林東雨  阅读(184)  评论(0编辑  收藏  举报