【题解 | 双端队列】天梯赛练习集:重排链表

2024-04-17 16:28

本文主要是介绍【题解 | 双端队列】天梯赛练习集:重排链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

重排链表

给定一个单链表 L 1 → L 2 → . . . → L n − 1 → L n L_1 \to L_2 \to ...\to L_{n-1}\to L_n L1L2...Ln1Ln,将其重新排列后变为 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} ... L1LnL2Ln1L3Ln2...,例如:给定 L L L 1 → 2 → 3 → 4 → 5 → 6 1→2→3→4→5→6 123456 ,则输出应该为 6 → 1 → 5 → 2 → 4 → 3 6→1→5→2→4→3 615243

输入格式:

每个输入包含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;
}

测试链接:重排链表

这篇关于【题解 | 双端队列】天梯赛练习集:重排链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912286

相关文章

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-