很容易想到反转链表这个经典链表题,但是本着能用数组就用数组的解题原则,就没建链表。
解题思路:
1、通过哈希表确定结点顺序,存入数组
2、按照规则遍历数组
#include <bits/stdc++.h>
using namespace std;
string first;
int N, K;
struct Pair {
string addr;
string data;
Pair(string a, string d): addr(a), data(d) {}
};
int main() {
cin >> first >> N >> K;
map<string, vector<string>> map;
for (int i = 0; i < N; ++i) {
string tmp;
vector<string> v(2);
cin >> tmp >> v[0] >> v[1];
map[tmp] = v;
}
vector<Pair> nodes;
string now = first;
while (now != "-1") {
vector<string> tmp = map[now];
Pair p(now, tmp[0]);
nodes.emplace_back(p);
now = tmp[1];
}
int n = nodes.size(); // 不能用N, 否则测试点6过不了,因为有脏结点,根本不在链表里。
int d = (n % K == 0) ? K : (n % K);
for (int i = n - d; i >= 0; i -= K) {
int j = i - K;
d = min(i + K, n);
for (int k = i; k < d; ++k) {
Pair p = nodes[k];
cout << p.addr << " " << p.data << " ";
if (k == d - 1) {
if (j >= 0) {
cout << nodes[j].addr << endl;
} else {
cout << -1 << endl;
return 0;
}
} else {
cout << nodes[k + 1].addr << endl;
}
}
}
}