Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. template<class Value, class Key, int numLevels>
  2. void SkipList<Value, Key, numLevels>::removeNext(SkipList::Node *nodeBefore)
  3. {
  4. if (nodeBefore == nullptr || nodeBefore->next == nullptr || nodeBefore->next == Base::_preHead)
  5. {
  6. throw std::invalid_argument("There isn't any element after nodeBefore");
  7. }
  8.  
  9. nodeBefore = nodeBefore->next; // we can't remove element after nodeBefore if it has more levels
  10. Node *currentNode = Base::_preHead;
  11. Node *prevNodes[nodeBefore->levelHighest + 1];
  12. int currentLevel = numLevels - 1;
  13. while (currentLevel >= 0)
  14. {
  15. if ((currentNode->nextJump[currentLevel] == Base::_preHead) ||
  16. (currentNode->nextJump[currentLevel]->key >= nodeBefore->key && currentLevel > nodeBefore->levelHighest) ||
  17. (currentNode->nextJump[currentLevel] == nodeBefore))
  18. {
  19. if (currentLevel <= nodeBefore->levelHighest)
  20. prevNodes[currentLevel] = currentNode;
  21. currentLevel--;
  22. }
  23. else
  24. currentNode = currentNode->nextJump[currentLevel];
  25. }
  26.  
  27. while (currentNode->next != Base::_preHead && currentNode->next != nodeBefore)
  28. currentNode = currentNode->next;
  29.  
  30. for (int i = 0; i <= nodeBefore->levelHighest; ++i)
  31. prevNodes[i]->nextJump[i] = nodeBefore->nextJump[i];
  32.  
  33. currentNode->next = nodeBefore->next;
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement