У меня возникли трудности с кодированием способа поиска элемента в списке пропуска.
Я пытаюсь реализовать это так, чтобы, если мы ищем элемент, а этот элемент не существует в списке, возвращалось следующее наибольшее значение; это сделало бы его идеальным для вставки. Однако, если элемент найден, верните этот элемент.
Я использую это для своего метода remove(T key)
; если мы найдем элемент, то удалим его. Если его нет в списке, throw new java.util.NoSuchElementException()
.
Хотя моя текущая реализация нормально работает для вставки, я обнаружил, что она не работает при поиске существующего элемента — вместо этого она получает следующее значение. (Технически это не должно работать для вставки, но работает).
**********************
SkipList (size = 3)
Level: 2 (null), , , (5)
Level: 1 (null), (3), (4), (5)
**********************
Выше показано, как сейчас выглядит список пропуска.
Ниже представлена структура списка пропуска, который я делаю. Левосторонние часовые — это узлы с нулевыми данными; у нас также есть фантомный узел, выступающий в роли головы; фантомная голова помогает нам отслеживать текущее количество уровней в списке пропуска. Структурная схема
private Node<T> search(T key) {
Node<T> node = head;
boolean found = false;
while (!found) {
while (compare(node.getNext().getData(), key) <= 0) {
node = node.getNext();
}
if (node.getDown() != null) {
node = node.getDown();
} else {
node = node.getNext();
found = true;
}
}
return node;
}
В его текущем состоянии, если мы попробуем search(4)
, возвращенный узел будет 5
, даже если 4
есть в списке.