classSkiplistNode { public: int value; vector<SkiplistNode*> next;
SkiplistNode(int val, int level): value(val), next(level) {} // 一个节点一旦生成,level就是固定的 };
classSkiplist { private: SkiplistNode* head; int level;
intrandLevel(){ int ans = 1; while (ans < MAX_LEVEL && rand() < p) { ans++; } return ans; } public: Skiplist() { head = newSkiplistNode(-1, MAX_LEVEL); // 每层一旦出现,就一定需要head节点 level = 0; }
boolsearch(int target){ SkiplistNode* p = head; for (int i = level - 1; i >= 0; i--) { while (p->next[i] && p->next[i]->value < target) { p = p->next[i]; } } p = p->next[0]; return p && p->value == target; }
voidadd(int num){ int newLevel = randLevel(); vector<SkiplistNode*> update(newLevel, head); SkiplistNode* p = head; for (int i = level - 1; i >= 0; i--) { while (p->next[i] && p->next[i]->value < num) { p = p->next[i]; } if (i < newLevel) { update[i] = p; } }
level = max(level, newLevel); SkiplistNode* newNode = newSkiplistNode(num, newLevel); for (int i = 0; i < newLevel; i++) { newNode->next[i] = update[i]->next[i]; update[i]->next[i] = newNode; } }
boolerase(int num){ vector<SkiplistNode*> update(level); SkiplistNode* p = head; for (int i = level - 1; i >= 0; i--) { while (p->next[i] && p->next[i]->value < num) { p = p->next[i]; } update[i] = p; }
p = p->next[0]; if (!p || p->value != num) { returnfalse; }
for (int i = 0; i < level; i++) { if (update[i]->next[i] != p) { break; } update[i]->next[i] = p->next[i]; } delete p;
/** * Your Skiplist object will be instantiated and called as such: * Skiplist* obj = new Skiplist(); * bool param_1 = obj->search(target); * obj->add(num); * bool param_3 = obj->erase(num); */
def__randLevel(self): ans = 1 while ans < MAX_LEVEL and random.random() < P: ans += 1 return ans
defsearch(self, target: int) -> bool: p = self.head for i inrange(self.level - 1, -1, -1): while p.next[i] and p.next[i].value < target: p = p.next[i] p = p.next[0] # return p and p.value == target # 不可!p为None的化这一行会return None而不是False! return p isnotNoneand p.value == target
defadd(self, num: int) -> None: newLevel = self.__randLevel() update = [self.head] * newLevel p = self.head for i inrange(self.level - 1, -1, -1): while p.next[i] and p.next[i].value < num: p = p.next[i] if i < newLevel: update[i] = p
self.level = max(self.level, newLevel) newNode = SkiplistNode(num, newLevel) for i inrange(newLevel): newNode.next[i] = update[i].next[i] update[i].next[i] = newNode
deferase(self, num: int) -> bool: update: List[SkiplistNode | Any] = [None] * self.level p = self.head for i inrange(self.level - 1, -1, -1): while p.next[i] and p.next[i].value < num: p = p.next[i] update[i] = p
p = p.next[0] ifnot p or p.value != num: returnFalse
for i inrange(self.level): if update[i].next[i] != p: break update[i].next[i] = p.next[i] whileself.level > 0andnotself.head.next[self.level - 1]: self.level -= 1 returnTrue
# Your Skiplist object will be instantiated and called as such: # obj = Skiplist() # param_1 = obj.search(target) # obj.add(num) # param_3 = obj.erase(num)