private Node<K, V> removeNodeByKey( K key ) {
        if( key == null ) { return null; }

        final Node<K, V>[] buckets = mKeyBuckets;
        final int          hash    = rehash( key.hashCode() );
        final int          idx     = (hash & (buckets.length - 1));

        Node<K, V> node = buckets[idx];
        while( node != null ) {
            if( hash == node.mHash && (key == node.mKey || key.equals( node.mKey )) ) {
                removeNodeCompletely( node, true );
                return node;
            }

            node = node.mNext;
        }

        return null;
    }