public static bool Delete <T>(this Skiplist <T> skiplist, T key)
        {
            if (skiplist.Head == null)
            {
                return(false);
            }

            if (skiplist.Head.Down == null && skiplist.AreEqual(skiplist.Head.Key, key))
            {
                return(TryRemoveCurrentHead(skiplist, key));
            }

            var keyFound =
                skiplist.Find(
                    key: key,
                    pathAction: node => HandlePathToDeletionPoint(node, key, skiplist.MinimumGapSize, skiplist.AreEqual),
                    origin: skiplist.Head.Down);

            if (skiplist.Head.Down.LengthOfList() <= 1)
            {
                skiplist.Head    = skiplist.Head.Down;
                skiplist.Head.Up = null;
            }

            return(keyFound);
        }
        public static void Insert <T>(this Skiplist <T> skiplist, T key)
        {
            if (skiplist.Head == null)
            {
                skiplist.Head = skiplist.NodeFactory(key);
                skiplist.Head.ConnectTo(skiplist.Head);
                return;
            }

            skiplist.Find(key, pathAction: node => InserterAction(key, skiplist, node));

            if (skiplist.Head.DistanceRightTo(skiplist.Head) > 1)
            {
                var newHead = skiplist.NodeFactory(skiplist.Head.Key);
                newHead.ConnectTo(newHead);
                newHead.ConnectDownTo(skiplist.Head);

                skiplist.Head = newHead;
            }
        }