code: public Block split(int newId) {
          int ptr = this.ptr;
          this.ptr = -1;
          int high = this.high;
          int ptrHighDiff = high - ptr;
          if (ptrHighDiff == 0) {
              return null;
          }
          int low = this.low;
          Block splt;
          if (ptrHighDiff > ptr - low) {
              splt = new Block(low, ptr, newId, nextBlock);
              this.low = ptr;
          } else {
              splt = new Block(ptr, high, newId, nextBlock);
              this.high = ptr;
          }
          this.nextBlock = splt;
          return splt;
      }
docs: Splits this block, if applicable. If this block cannot be split, {@code null} is returned.
  <p>
  A new block (the split result) is created if both <code>{@link #ptr} &gt; {@link #low}</code> and <code>{@link
  #ptr} &lt; {@link #high}</code>. This new block will contain either the elements between {@link #low} (inclusive)
  and {@link #ptr} (exclusive), or between {@link #ptr} (inclusive) and {@link #high} (exclusive), depending on
  whichever range is smaller. This block will be updated to contain the remaining elements.
  <p>
  When this method returns (regardless of whether a new block is created), the {@link #ptr} field will have been
  reset to {@code -1}.
  
  @param newId
  the ID of the newly created block, if applicable
  
  @return a block