输出代码 给定一个常数K和一个单链表L,要求按每K个节点反转单链表L。例如,给定L为1->2->3->4->5->6,如果K=3,应输出3->2->1->6->5->4,如果K=4,应输出4->3->2->1->5->6。 输入 每次输入一个案例,对于每一个案例: 第一行包含三个值:第一个节点的地址、节点总数N(<=10^5,正整数)、需要反转的子链表的长度K(<=N, 正整数)。 节点的地址是一个5位的非负整数,NULL用-1来代替。 下面接着输入N行,一行表示一个节点,格式为Address Data Next。其中Address为该节点的地址,Data为该节点的数据,Next为下一个节点的地址。 !!!注意:Address和Next字段都不是节点的真实存储地址,只是用来做示例,用于标识头节点和下一个节点是哪一个,真实的地址仍需要new出来后由计算机分配,不能直接向示例中的地址里写数据。 输出 对于每一个输入案例,输出反序后的单链表。其中每一个节点占一行,格式与输入一致。
时间: 2023-05-18 17:05:29 浏览: 117
带头结点的单链表,反转并输出
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Node {
int address, data, next;
};
int main() {
int first, n, k;
cin >> first >> n >> k;
vector<Node> nodes(100000);
for (int i = 0; i < n; i++) {
int address, data, next;
cin >> address >> data >> next;
nodes[address] = {address, data, next};
}
vector<Node> list;
while (first != -1) {
list.push_back(nodes[first]);
first = nodes[first].next;
}
for (int i = 0; i < list.size(); i += k) {
if (i + k <= list.size()) {
reverse(list.begin() + i, list.begin() + i + k);
}
}
for (int i = 0; i < list.size(); i++) {
printf("%05d %d ", list[i].address, list[i].data);
if (i == list.size() - 1) {
printf("-1\n");
} else {
printf("%05d\n", list[i + 1].address);
}
}
return 0;
}
阅读全文