本文主要是介绍【题解 | 双端队列】天梯赛练习集:重排链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
重排链表
给定一个单链表 L 1 → L 2 → . . . → L n − 1 → L n L_1 \to L_2 \to ...\to L_{n-1}\to L_n L1→L2→...→Ln−1→Ln,将其重新排列后变为 L 1 → L n → L 2 → L n − 1 → L 3 → L n − 2 . . . L_1 \to L_n \to L_2 \to L_{n-1} \to L_3 \to L_{n-2} ... L1→Ln→L2→Ln−1→L3→Ln−2...,例如:给定 L L L为 1 → 2 → 3 → 4 → 5 → 6 1→2→3→4→5→6 1→2→3→4→5→6 ,则输出应该为 6 → 1 → 5 → 2 → 4 → 3 6→1→5→2→4→3 6→1→5→2→4→3 。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数 N ( ≤ 1 0 5 ) N (≤10^5 ) N(≤105)。结点的地址是5位非负整数,NULL地址用−1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址;Data是该结点保存的数据,为不超过 1 0 5 10^5 105 的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。
输出格式:
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1
解题思路:
这个问题可以通过使用双端队列来解决。首先,我们将链表中的所有节点按照原始顺序添加到双端队列中。然后,我们交替从双端队列的前端和后端取出节点并将它们连接起来,就得到了所需的链表。
当然,使用两个栈也是一样的。
#include <bits/stdc++.h>
using namespace std;struct Node {int address, data, next;int order = 2 * 100000; // 初始化节点顺序为一个较大的数
} nodes[100000];// 比较函数,用于按照节点顺序排序
bool cmp(Node a, Node b) {return a.order < b.order;
}int main() {int begin, n, address;cin >> begin >> n; // 读取链表开始地址和节点数量for (int i = 0; i < n; i++) {cin >> address; // 读取节点地址cin >> nodes[address].data >> nodes[address].next; // 读取节点数据和下一个节点地址nodes[address].address = address; // 记录节点地址}int count = 0;// 遍历链表,记录节点顺序while (begin != -1) {nodes[begin].order = count++;begin = nodes[begin].next;}// 按照节点顺序排序sort(nodes, nodes + 100000, cmp);deque<Node> dq;// 将节点按照顺序添加到双端队列中for (int i = 0; i < count; i++) {dq.push_back(nodes[i]);}vector<Node> ans;// 交替从双端队列的前端和后端取出节点while (!dq.empty()) {ans.push_back(dq.back());dq.pop_back();if (!dq.empty()) {ans.push_back(dq.front());dq.pop_front();}}// 输出重新排列后的链表for (size_t i = 0; i < ans.size() - 1; i++) {printf("%05d %d %05d\n", ans[i].address, ans[i].data, ans[i + 1].address);}// 输出最后一个节点printf("%05d %d -1\n", ans[ans.size() - 1].address, ans[ans.size() - 1].data);return 0;
}
测试链接:重排链表
这篇关于【题解 | 双端队列】天梯赛练习集:重排链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!