我在编写一种在跳过列表中查找元素的方法时遇到了一些困难。
我正在尝试实现它,如果我们正在搜索一个元素并且该元素在列表中不存在,则返回下一个最大值;这将使其成为插入的理想选择。但是,如果找到该元素,则返回该元素。
我将其用于我的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
它在列表中。