文章目录
- Part.I Attention
- Part.II Funciton
- Part.III Code
Part.I Attention
- deque 是 double-ended queue 的缩写,意即双端队列,详细信息参见官网。
deque<T>
容器适配器是- 必须要包含头文件
#include <deque>
deque
相较于vector
:①它不擅长在中间添加删除元素;②它擅长在队列头部和尾部添加删除元素,时间复杂度为O(1)
,而vector
只有在尾部添加删除元素的时间复杂度才为O(1)
。deque
相较于queue
:queue只擅长在头部删除元素,在尾部添加元素;而deque在头部和尾部都擅长添加或删除元素。
Part.II Funciton
deque
的函数相较于queue
就多很多了,和Vector
相当,如下图:
下面是对常用函数的说明:
函数 | 解释 |
---|---|
begin() | 开始的迭代器 |
end() | 结束的迭代器 |
rbegin() | 反向开始的迭代器 |
rend() | 反向结束的迭代器 |
size() | 所含元素个数 |
max_size | 最大能容纳的元素个数 |
resize() | 重新调整其大小 |
empty() | 判断其是否是空的 |
front() | 最前面的元素 |
back() | 最后面的元素 |
assign() | 可用它通过数组来对其进行赋值 |
push_back() | 在双端队列后面添加元素 |
push_front() | 在双端队列前面添加元素 |
pop_back() | 弹出双端队列最后一个元素 |
pop_front() | 弹出双端队列最前面一个元素 |
insert() | 插入元素,有好几种用法 |
erase(d.begin(),d.begin()+3) | 删除前面3个元素 |
a.swap(b) | 交换a 和b |
clear() | 清空所有元素 |
emplace(itr,a) | 在迭代器itr 位置前插入元素a ,返回a 的迭代器 |
emplace_front() | 在前面插入元素 |
emplace_back() | 在后面插入元素 |
Part.III Code
LeetCode 的剑指 Offer II 026. 重排链表 就可以用双端队列来解决,下面是笔者所写的代码。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
deque<ListNode*> dqu;
while(head) {
dqu.emplace_back(head);
head=head->next;
}
ListNode* pre=nullptr;
while(dqu.size()>=2) {
if(!pre) {
pre=dqu.front();
}
else {
pre->next=dqu.front();
pre=pre->next;
}
pre->next=dqu.back();
pre=pre->next;
dqu.pop_front();dqu.pop_back();
}
if(!dqu.empty()) {
if(!pre) pre=dqu.front();
else {
pre->next=dqu.front();
pre=pre->next;
}
}
pre->next=nullptr;
}
};
可以作为一个使用双端队列的示例,但是对于此题,使用双端队列并不一定是最优解。