Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<class Value, class Key, int numLevels>
- void SkipList<Value, Key, numLevels>::removeNext(SkipList::Node *nodeBefore)
- {
- if (nodeBefore == nullptr || nodeBefore->next == nullptr || nodeBefore->next == Base::_preHead)
- {
- throw std::invalid_argument("There isn't any element after nodeBefore");
- }
- nodeBefore = nodeBefore->next; // we can't remove element after nodeBefore if it has more levels
- Node *currentNode = Base::_preHead;
- Node *prevNodes[nodeBefore->levelHighest + 1];
- int currentLevel = numLevels - 1;
- while (currentLevel >= 0)
- {
- if ((currentNode->nextJump[currentLevel] == Base::_preHead) ||
- (currentNode->nextJump[currentLevel]->key >= nodeBefore->key && currentLevel > nodeBefore->levelHighest) ||
- (currentNode->nextJump[currentLevel] == nodeBefore))
- {
- if (currentLevel <= nodeBefore->levelHighest)
- prevNodes[currentLevel] = currentNode;
- currentLevel--;
- }
- else
- currentNode = currentNode->nextJump[currentLevel];
- }
- while (currentNode->next != Base::_preHead && currentNode->next != nodeBefore)
- currentNode = currentNode->next;
- for (int i = 0; i <= nodeBefore->levelHighest; ++i)
- prevNodes[i]->nextJump[i] = nodeBefore->nextJump[i];
- currentNode->next = nodeBefore->next;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement