Reversing Linked List (25)
- 热度指数:1386 时间限制:1秒 空间限制:32768K
- 算法知识视频讲解
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.
输入描述:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N
(<= 105) which is the total number of nodes, and a positive K (<=N) 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.
输出描述:
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.
示例1
输入
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
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct {
int pos;
int data;
int next;
}list;
list a[200000];
vector<list> b;
int main() {
int n = 0, head = 0, key = 0;
cin >> head >> n >> key;
for (int i = 0; i < n; i++) {
int temp = 0;
cin >> temp;
a[temp].pos = temp;
cin >> a[temp].data >> a[temp].next;
}
int p = head;
while (p != -1) {
b.push_back(a[p]);
p = a[p].next;
}
int len = b.size();
int m = len / key;
for (int i = 0; i < m; i++) {
int s = i*key;
int q = (i + 1)*key;
reverse(b.begin()+s, b.begin()+q);
}
for (int i = 0; i < len - 1; i++)
printf("%05d %d %05d\n", b[i].pos, b[i].data, b[i + 1].pos);
printf("%05d %d %d", b[len-1].pos, b[len-1].data, -1);
return 0;
}