「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
题目:
641. 设计循环双端队列
难度中等102收藏分享切换为英文接收动态反馈
设计实现双端队列。
你的实现需要支持以下操作:
- MyCircularDeque(k):构造函数,双端队列的大小为k。
- insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
- insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
- deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
- deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
- getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
- getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
- isEmpty():检查双端队列是否为空。
- isFull():检查双端队列是否满了。
示例:
MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
circularDeque.insertLast(1); // 返回 true
circularDeque.insertLast(2); // 返回 true
circularDeque.insertFront(3); // 返回 true
circularDeque.insertFront(4); // 已经满了,返回 false
circularDeque.getRear(); // 返回 2
circularDeque.isFull(); // 返回 true
circularDeque.deleteLast(); // 返回 true
circularDeque.insertFront(4); // 返回 true
circularDeque.getFront(); // 返回 4
提示:
- 所有值的范围为 [1, 1000]
- 操作次数的范围为 [1, 1000]
- 请不要使用内置的双端队列库。
思路:
- 第一眼看到题目,我想到的是小于
x
的值就往前冒泡,大于等于的就往后冒泡; - 但由于这是链表题,冒泡需要不断交换节点的指向,又显得特别麻烦,而且还要求不能改变原来节点的相对位置;
- 所以我就想到直接新开两个链表,小于
x
的放到链表1, 大于等于的放到链表2; - 然后链表1的尾部链接链表2的头部即可。
实现:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
// 链表1, 存放值小于x的元素
let newList1 = new ListNode(0);
// prev1 指向链表1的末尾节点
let prev1 = newList1;
// 链表2, 存放值大于等于x的元素
let newList2 = new ListNode(0);
// prev2 指向链表2的末尾节点
let prev2 = newList2;
while (head) {
// 拆断链表,不然会形成闭环
const next = head.next;
head.next = null;
if (head.val < x) {
prev1.next = head;
prev1 = prev1.next;
} else {
prev2.next = head;
prev2 = prev2.next;
}
head = next;
}
prev1.next = newList2.next;
return newList1.next;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。