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; } }