Tracing the Two Deques

Here is a sequence of operations on a deque of integers that starts out empty:

deque.addFirst(17);
deque.addLast(42);
deque.addFirst(28);
deque.removeLast();
deque.addLast(65);
deque.removeFirst();
deque.addFirst(31);
deque.addLast(53);
Solution

addFirst(17)

          ┌─────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 17 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └─────┘

addLast(42)

          ┌─────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 17 │ ◀──▶ │ 42 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └─────┘

addFirst(28)

          ┌─────┐      ┌────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 28 │ ◀──▶ │ 17 │ ◀──▶ │ 42 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └────┘      └─────┘

removeLast()

          ┌─────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 28 │ ◀──▶ │ 17 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └─────┘

addLast(65)

          ┌─────┐      ┌────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 28 │ ◀──▶ │ 17 │ ◀──▶ │ 65 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └────┘      └─────┘

removeFirst()

          ┌─────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 17 │ ◀──▶ │ 65 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └─────┘

addFirst(31)

          ┌─────┐      ┌────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 31 │ ◀──▶ │ 17 │ ◀──▶ │ 65 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └────┘      └─────┘

addLast(53)

          ┌─────┐      ┌────┐      ┌────┐      ┌────┐      ┌────┐      ┌─────┐
head ───▶ │ ░░░ │ ◀──▶ │ 31 │ ◀──▶ │ 17 │ ◀──▶ │ 65 │ ◀──▶ │ 53 │ ◀──▶ │ ░░░ │ ◀─── tail
          └─────┘      └────┘      └────┘      └────┘      └────┘      └─────┘
Solution

addFirst(17): front = 4, size = 1

┌────┬────┬────┬────┬────┐
│  _ │  _ │  _ │  _ │ 17 │
└────┴────┴────┴────┴────┘
                      ↑
                    front

addLast(42): front = 4, size = 2

┌────┬────┬────┬────┬────┐
│ 42 │  _ │  _ │  _ │ 17 │
└────┴────┴────┴────┴────┘
                      ↑
                    front

addFirst(28): front = 3, size = 3

┌────┬────┬────┬────┬────┐
│ 42 │  _ │  _ │ 28 │ 17 │
└────┴────┴────┴────┴────┘
                 ↑
               front

removeLast(): front = 3, size = 2

┌────┬────┬────┬────┬────┐
│  _ │  _ │  _ │ 28 │ 17 │
└────┴────┴────┴────┴────┘
                 ↑
               front

addLast(65): front = 3, size = 3

┌────┬────┬────┬────┬────┐
│ 65 │  _ │  _ │ 28 │ 17 │
└────┴────┴────┴────┴────┘
                 ↑
               front

removeFirst(): front = 4, size = 2

┌────┬────┬────┬────┬────┐
│ 65 │  _ │  _ │  _ │ 17 │
└────┴────┴────┴────┴────┘
                      ↑
                    front

addFirst(31): front = 3, size = 3

┌────┬────┬────┬────┬────┐
│ 65 │  _ │  _ │ 31 │ 17 │
└────┴────┴────┴────┴────┘
                 ↑
               front

addLast(53): front = 3, size = 4

┌────┬────┬────┬────┬────┐
│ 65 │ 53 │  _ │ 31 │ 17 │
└────┴────┴────┴────┴────┘
                 ↑
               front
Solution

addFirst(76): front = 2, size = 5

┌────┬────┬────┬────┬────┐
│ 65 │ 53 │ 76 │ 31 │ 17 │
└────┴────┴────┴────┴────┘
            ↑
          front

The array is now full, so addLast(19) calls grow first. grow copies the items in deque order, 76, 31, 17, 65, 53, into indices 0 to 4 of a new array of capacity 10 and sets front to 0. Then addLast writes 19 at index (0 + 5) % 10, which is 5. After addLast(19), front = 0 and size = 6:

┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 76 │ 31 │ 17 │ 65 │ 53 │ 19 │  _ │  _ │  _ │  _ │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
   ↑
 front