PAT_A1074#Reversing Linked List
Source:
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, andNext
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 }