Listing 6: Skiplist deletion function


template <class DATA, class KEY>
DATA * Skiplist<DATA,KEY>::remove( const KEY &key )
{
    SLPosition<DATA,KEY> *update[SLMAX_LEVEL];
    SLPosition<DATA,KEY> *cur = &head;
    DATA *to_ret = NULL;
    int i;

    for( i = level-1; i >= 0; i-- )
    {
        while( cur->forward[i] != NULL &&
          cur->forward[i]->key < key )
        {
             cur = cur->forward[i];
        }
        update[i] = cur;
    }
    cur = cur->forward[0];
    if( cur != NULL && cur->key == key )
    {
        to_ret = cur->data;
        for( i = 0; i < level; i++ )
        {
            if( update[i]->forward[i] != cur )
            {
                break;
            }
            else
            {
                update[i]->forward[i] = cur->forward[i];
            }
        }
        delete cur;
        while( level > 0 && head.forward[level] == NULL )
        {
            level--;
        }
    }
    return( to_ret );
}