public AmortizedPDeque<E> tail() {
        switch (size()) {
            case 0:
                throw new NoSuchElementException();
            case 1:
                return empty();
        }

        switch (front.size()) {
            case 0:
                // Should never happen
                throw new RuntimeException("Deque is broken. front.size() = 0, back.size = " + back.size());

            case 1:
                // If there's one element on front, dump back onto front,
                // but now we've already removed the head.
                return new AmortizedPDeque<E>(
                        ConsPStack.<E>empty().plusAll(back.subList(1)), // reverse order
                        ConsPStack.singleton(back.get(0)));

            default:
                // If there's more than one on front, we pop one off.
                return new AmortizedPDeque<E>(front.subList(1), back);
        }
    }