删除Java中的双向链接列表中的节点

时间:2019-02-05 08:24:44

标签: java data-structures linked-list doubly-linked-list

我正在学习Java中的双向链接列表,并且找到了有关删除具有特定键的节点的教程。

这是代码:

public Node deleteKey(int key) {
    Node current = first;
    while (current.getData() != key) {
        current = current.getNext();
        if (current == null) {
            return null;
        }
    }

    if (current == first) {
        first = current.getNext();
    } else {
        current.getPrevious().setNext(current.getNext()); 
    }

    if (current == last) {
        last = current.getPrevious();
    } else {
        current.getNext().setPrevious(current.getPrevious()); 
    }

    return current;
}

我想问你这个代码是否正确。我认为这是不正确的,因为他还需要这样做:

current.setNext(null);
current.setPrevious(null);

3 个答案:

答案 0 :(得分:6)

不需要调用current.setNext(null)current.setPrevious(null),因为调用deleteKey(int key)之后,列表中的Node都不会包含对已删除的Node的引用(由current引用),因此删除的Node所引用的Node是什么。

答案 1 :(得分:2)

并不是绝对必须将下一个和上一个指针设置为null,但是,由于节点是通过deleteKey方法返回的,因此我同意您的看法:设置它们最好更好到null并防止任何内存泄漏。 此代码的另一个问题是,如果列表为空,则first将为null,而while表达式将引发NPE。

答案 2 :(得分:0)

由于从列表中删除了该节点,因此无需设置null的下一个和前一个。

请记住,遍历双向链表的唯一方法是从第一个或头节点开始,一直继续到所需的节点或最后一个/尾节点。如果要删除一个节点,只需将其前一个链接到下一个节点,反之亦然。

话虽如此,将已删除节点的下一个和上一个设置为null并没有错,因为这可以防止您通过该节点的引用遍历列表。