code: public void remove(Node<E> node)
      {
          lock.writeLock().lock();
          assert node.value != null;
          node.value = null;
          try
          {
              size--;
  
              // go up through each level in the skip list, unlinking this node; this entails
              // simply linking each neighbour to each other, and appending the size of the
              // current level owned by this node's index to the preceding neighbour (since
              // ownership is defined as any node that you must visit through the index,
              // removal of ourselves from a level means the preceding index entry is the
              // entry point to all of the removed node's descendants)
              for (int i = 0 ; i < node.height() ; i++)
              {
                  Node<E> prev = node.prev(i);
                  Node<E> next = node.next(i);
                  assert prev != null;
                  prev.setNext(i, next);
                  if (next != null)
                      next.setPrev(i, prev);
                  prev.size[i] += node.size[i] - 1;
              }
  
              // then go up the levels, removing 1 from the size at each height above ours
              for (int i = node.height() ; i < maxHeight ; i++)
              {
                  // if we're at our height limit, we backtrack at our top level until we
                  // hit a neighbour with a greater height
                  while (i == node.height())
                      node = node.prev(i - 1);
                  node.size[i]--;
              }
          }
          finally
          {
              lock.writeLock().unlock();
          }
      }
docs: remove the provided node and its associated value from the list