public class SimpleDeque implements MinimalDeque { private static class Node { T value; Node next; Node prev; Node(T value) { this.value = value; } } private Node head; private Node tail; private int size; public SimpleDeque() { head = null; tail = null; size = 0; } @Override public void addFirst(T element) { Node newNode = new Node<>(element); if (isEmpty()) { head = tail = newNode; } else { newNode.next = head; head.prev = newNode; head = newNode; } size++; } @Override public void addLast(T element) { Node newNode = new Node<>(element); if (isEmpty()) { head = tail = newNode; } else { newNode.prev = tail; tail.next = newNode; tail = newNode; } size++; } @Override public T removeFirst() { if (isEmpty()) { throw new IllegalStateException("Deque is empty"); } T value = head.value; head = head.next; if (head != null) { head.prev = null; } else { tail = null; } size--; return value; } @Override public T removeLast() { if (isEmpty()) { throw new IllegalStateException("Deque is empty"); } T value = tail.value; tail = tail.prev; if (tail != null) { tail.next = null; } else { head = null; } size--; return value; } @Override public T peekFirst() { if (isEmpty()) { return null; } return head.value; } @Override public T peekLast() { if (isEmpty()) { return null; } return tail.value; } @Override public boolean isEmpty() { return size == 0; } @Override public int size() { return size; } }