Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements 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
算法设计:
由于所给的地址是5位非负整数,可以定义两个维度为100005的一维数组data、Next,负责储存数据域和下一个地址
定义一个vector<int>listAddress,由所给链表开始地址处开始遍历整个链表,按遍历顺序将各结点地址储存到listAddress中。
按要求对listAddress数组进行翻转,可以利用c语言库里的reverse函数
按格式要求进行结果输出
注意点:
(1)题目给出的结点中可能有不在链表中的无效结点
(2)翻转时要注意如果最后一组要翻转的结点数量小于K,则不进行翻转;如果等于K,需要进行翻转
(3)输出时结点地址除-1外要有5位数字,不够则在高位补0 。所以地址-1要进行特判输出
1 //s首先说明一下PAT的常见陷阱,就是给出的数据未必是一条链表,可能是多条, 2 //所以首先从输入的数据的中找到那条链表 3 //巨简单,使用vector反转就行了 4 #include <iostream> 5 #include <vector> 6 #include <algorithm> 7 using namespace std; 8 int head, N, K; 9 int nodes[100100], nexts[100100]; 10 vector<int>list; 11 int main() 12 { 13 cin >> head >> N >> K; 14 int adrr, data, next, temp = head; 15 for (int i = 0; i < N; ++i) 16 { 17 cin >> adrr >> data >> next; 18 nodes[adrr] = data; 19 nexts[adrr] = next; 20 } 21 while (temp != -1)//找出这条链表 22 { 23 list.push_back(temp); 24 temp = nexts[temp]; 25 } 26 for (int i = K; i <= list.size(); i += K) 27 reverse(list.begin() + i - K, list.begin() + i); 28 for (int i = 0; i < list.size(); ++i) 29 { 30 printf("%05d %d ", list[i], nodes[list[i]]); 31 if (i < list.size() - 1) 32 printf("%05d ", list[i+1]); 33 else 34 printf("-1 "); 35 } 36 return 0; 37 }