private void removeAtPosition(VListLocation<T> where) {
    /* Scan backward across the blocks after this element, shuffling array
     * elements down a position and copying the last element of the next
     * block over to fill in the top.
     * 
     * The variable shuffleTargetPosition indicates the first element of the
     * block that should be overwritten during the shuffle-down. In the
     * first block, this is the position of the element that was
     * overwritten. In all other blocks, it's the last element.
     */
    VListCell<T> curr = where.mCell;
    for (int shuffleTargetPosition = where.mOffset; curr != null; 
         curr = curr.mPrev, shuffleTargetPosition = (curr == null? 0 : curr.mElems.length - 1)) {
      /* Shuffle down each element in the current array on top of the
       * target position. Note that in the final block, this may end up
       * copying a whole bunch of null values down. This is more work than
       * necessary, but is harmless and doesn't change the asymptotic
       * runtime (since the last block has size O(n)).
       */
      for (int i = shuffleTargetPosition - 1; i >= 0; --i)
        curr.mElems[i + 1] = curr.mElems[i];

      /* Copy the last element of the next array to the top of this array,
       * unless this is the first block (in which case there is no next
       * array).
       */
      if (curr.mPrev != null)
        curr.mElems[0] = curr.mPrev.mElems[curr.mPrev.mElems.length - 1];
    }

    /* The head just lost an element, so it has some more free space. Null
     * out the lost element and increase the free space.
     */
    ++mHead.mFreeSpace;
    mHead.mElems[mHead.mFreeSpace - 1] = null;

    /* The whole list just lost an element. */
    --mSize;

    /* If the head is entirely free, remove it from the list. */
    if (mHead.mFreeSpace == mHead.mElems.length) {
      mHead = mHead.mNext;

      /* If there is at least one block left, remove the previous block
       * from the linked list.
       */
      if (mHead != null)
        mHead.mPrev = null;
    }
  }