class MyCircularDeque1 { public Deque<Integer> deque = new LinkedList<>(); public int size; public int limit; public MyCircularDeque1(int k) { limit = k; size = 0; } public boolean insertFront(int value) { if (isFull()) { return false; }else { deque.offerFirst(value); size++; return true; } } public boolean insertLast(int value) { if (isFull()) { return false; }else { deque.offerLast(value); size++; return true; } } public boolean deleteFront() { if (isEmpty()) { return false; }else { deque.pollFirst(); size--; return true; } } public boolean deleteLast() { if (isEmpty()) { return false; }else { deque.pollLast(); size--; return true; } } public int getFront() { return deque.isEmpty() ? -1 : deque.peekFirst(); } public int getRear() { return deque.isEmpty() ? -1 : deque.peekLast(); } public boolean isEmpty() { return size == 0; } public boolean isFull() { return size == limit; } }
class MyCircularDeque2 { public int[] deque; public int l, r, size, limit; public MyCircularDeque2(int k) { deque = new int[k]; l = r = size = 0; limit = k; } public boolean insertFront(int value) { if (isFull()) { return false; }else { if (isEmpty()) { l = r = 0; deque[0] = value; }else { l = l == 0 ? (limit - 1) : (l - 1); deque[l] = value; } size++; return true; } } public boolean insertLast(int value) { if (isFull()) { return false; }else { if (isEmpty()) { l = r = 0; deque[0] = value; }else { r = r == (limit - 1) ? 0 : (r + 1); deque[r] = value; } size++; return true; } } public boolean deleteFront() { if (isEmpty()) { return false; }else { l = l == (limit - 1) ? 0 : (l + 1); size--; return true; } } public boolean deleteLast() { if (isEmpty()) { return false; }else { r = r == 0 ? (limit - 1) : (r - 1); size--; return true; } } public int getFront() { if (isEmpty()) { return -1; }else { return deque[l]; } } public int getRear() { if (isEmpty()) { return -1; }else { return deque[r]; } } public boolean isEmpty() { return size == 0; } public boolean isFull() { return size == limit; } }