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

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

            case 1:
                return new AmortizedPDeque<E>(
                        ConsPStack.singleton(front.get(0)),
                        ConsPStack.<E>empty().plusAll(front.subList(1))); // reverse order

            default:
                return new AmortizedPDeque<E>(front, back.subList(1));

        }
    }