• ㊗️
• 大家
• offer
• 多多！

Problem

Design your implementation of the circular double-ended queue (deque).

Implement the MyCircularDeque class:

• MyCircularDeque(int k) Initializes the deque with a maximum size of k.
• boolean insertFront() Adds an item at the front of Deque. Returns true if the operation is successful, or false otherwise.
• boolean insertLast() Adds an item at the rear of Deque. Returns true if the operation is successful, or false otherwise.
• boolean deleteFront() Deletes an item from the front of Deque. Returns true if the operation is successful, or false otherwise.
• boolean deleteLast() Deletes an item from the rear of Deque. Returns true if the operation is successful, or false otherwise.
• int getFront() Returns the front item from the Deque. Returns -1 if the deque is empty.
• int getRear() Returns the last item from Deque. Returns -1 if the deque is empty.
• boolean isEmpty() Returns true if the deque is empty, or false otherwise.
• boolean isFull() Returns true if the deque is full, or false otherwise.

Example 1:

Input
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 2, true, true, true, 4]

Explanation
MyCircularDeque myCircularDeque = new MyCircularDeque(3);
myCircularDeque.insertLast(1);  // return True
myCircularDeque.insertLast(2);  // return True
myCircularDeque.insertFront(3); // return True
myCircularDeque.insertFront(4); // return False, the queue is full.
myCircularDeque.getRear();      // return 2
myCircularDeque.isFull();       // return True
myCircularDeque.deleteLast();   // return True
myCircularDeque.insertFront(4); // return True
myCircularDeque.getFront();     // return 4

Constraints:

• 1 <= k <= 1000
• 0 <= value <= 1000
• At most 2000 calls will be made to insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull.

Code

class MyCircularDeque {
class Node {
Node pre;
Node next;
int val;

public Node(int v) {
val = v;
}
}

int currSize;
int maxSize;
Node tail;

public MyCircularDeque(int k) {
tail = new Node(-1);
maxSize = k;
currSize = 0;
}

public boolean insertFront(int value) {
if (currSize == maxSize) return false;

Node node = new Node(value);

currSize++;
return true;
}

public boolean insertLast(int value) {
if (currSize == maxSize) return false;

Node node = new Node(value);

node.next = tail.next;
tail.next.pre = node;
tail.next = node;
node.pre = tail;

currSize++;
return true;
}

public boolean deleteFront() {
if (currSize == 0) return false;

currSize--;
return true;
}

public boolean deleteLast() {
if (currSize == 0) return false;

tail.next.next.pre = tail;
tail.next = tail.next.next;
currSize--;
return true;
}

public int getFront() {
}

public int getRear() {
return tail.next.val;
}

public boolean isEmpty() {
return currSize == 0;
}

public boolean isFull() {
return currSize == maxSize;
}
}