boolsearch(int target){ auto cur = head; while (cur) { while (cur->right && cur->right->val < target) { cur = cur->right; } if (cur->right && cur->right->val == target) { returntrue; } cur = cur->down; } returnfalse; }
voidadd(int num){ int r_level = 1; while (r_level <= max_level && (rand() & 1 == 0)) { ++r_level; } if (r_level > max_level) { max_level = r_level; head = newNode(num, nullptr, head); } Node *cur = head; Node *last = nullptr; for (int l = max_level; l >= 1; --l) { while (cur->right && cur->right->val < num) { cur = cur->right; } if (l <= r_level) { cur->right = newNode(num, cur->right, nullptr); if (last) { last->down = cur->right; } last = cur->right; } cur = cur->down; } }
boolerase(int num){ auto cur = head; bool seen = false; for (int l = max_level; l >= 1; --l) { while (cur->right && cur->right->val < num) { cur = cur->right; } if (cur->right && cur->right->val == num) { seen = true; Node *temp = cur->right; cur->right = cur->right->right; delete temp; } cur = cur->down; } return seen; }
private: int max_level = 0; Node *head = nullptr; };