private void InsertAfterOnCurrentLevel(SkipListNode <K, V> prevNode, SkipListNode <K, V> newNode) { var successorNode = prevNode.Next; prevNode.Next = newNode; newNode.Prev = prevNode; newNode.Next = successorNode; successorNode.Prev = newNode; }
private SkipListNode <K, V> FindHighestNodeLessThanAtCurrentLevel(SkipListNode <K, V> startNode, K key) { var currentNode = startNode; //currentnodekey<=key while (_comparer.Compare(currentNode.Next.Entry.Key, key) <= 0) { currentNode = currentNode.Next; } return(currentNode); }
private void CreateNewLevel() { var negInfNode = CreateNegInfNode(); var posInfNode = CreatePosInfNode(); if (_head != null && _tail != null) { _head.Up = negInfNode; _tail.Up = posInfNode; negInfNode.Down = _head; posInfNode.Down = _tail; } _head = negInfNode; _tail = posInfNode; _head.Next = _tail; _tail.Prev = _head; }
public override V Put(K key, V value) { var node = Find(key); if (_comparer.Compare(key, node.Entry.Key) == 0) { var old = node.Entry.Value; node.Entry.Value = value; return(old); } var prevNewNode = new SkipListNode <K, V>(key, value); InsertAfterOnCurrentLevel(node, prevNewNode); var i = 1; while (_random.NextDouble() < 0.5) { if (i > _height) { CreateNewLevel(); _height++; } while (node.Up == null) { node = node.Prev; } node = node.Up; var newNode = new SkipListNode <K, V>(key, default(V)); //value only needs to be stored on lowest level InsertAfterOnCurrentLevel(node, newNode); prevNewNode.Up = newNode; newNode.Down = prevNewNode; prevNewNode = newNode; i++; } n++; return(value); }