在“跳过列表”中搜索元素

时间:2015-03-03 18:16:42

标签: java list skip-lists

我在编写一个在跳过列表中找到元素的方法时遇到了一些困难。

我正在尝试实现它,这样,如果我们正在搜索一个元素并且该元素在List中不存在,那么返回下一个最大的值;这将使其成为插入的理想选择。 但是,如果元素位于,则返回该元素。

我将此用于我的remove(T key)方法;如果我们找到该元素,则将其删除。如果它不在列表中,throw new java.util.NoSuchElementException()

虽然我当前的实现可以正常插入,但我发现它不能用于查找现有元素 - 相反,它将获得下一个值。 (它在技术上不应该用于插入,但确实如此)。

********************** SkipList (size = 3) Level: 2 (null), , , (5) Level: 1 (null), (3), (4), (5) **********************

上面是Skip List目前的样子。

下面是我正在制作的跳过列表的结构。左手哨兵是数据为空的节点;我们还有一个幻像节点作为头部;幻像头帮助我们跟踪跳过列表中当前的级别数。 Diagram of structure

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位于列表中。

1 个答案:

答案 0 :(得分:0)

我在这里看到了很多问题。

  1. 你实际上在哪里返回价值?我认为没有回复声明,但我认为你只是在底部遗漏了return node;

  2. 您永远不会确认最终价值确实是您正在寻找的。您需要某种方式来表明找不到值,我假设?

  3. 您目前只是决定是否找不到该节点。

  4. 我认为你需要重新考虑算法。试试这段代码:

    private Node<T> search(T key) {
        Node<T> node = head;
        boolean found = false;
    
        while (!found) {
            //special case to return a node containing null - indicates value not in list
            if (node == null) return new Node(null);
            //We found it!
            else if (node.getData().equals(key)) found = true;
            //Go to the next one over if it's not too high.
            else if (node.getNext() != null && compare(node.getNext().getData(), key) <= 0) node = node.getNext();
            //It was too high, so go down instead.
            else node = node.getDown();
        }
        return node;
    }
    

    注意在内部while循环中检查空条件 - 这可以防止您在不存在的下一个节点上调用getData(),这将导致空指针异常。另请注意您如何检查空值是否下降。这是因为如果它不在列表中,您只会遇到它,因此开始时的特殊情况将在下次循环执行时捕获该空值。

    您还可以调整它如何检查值是否相等。我使用.equals但您可以将其更改为使用compare方法,具体取决于您检查相等性的方式。