我正在学习有关使用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);
调用current.setNext(null)
和current.setPrevious(null)
是没有必要的,因为调用deleteKey(int key)
后,没有列表的Node
将包含对去除Node
(由current
引用)的引用,所以也无所谓什么Node
s删除的Node
指的是。
这是完全没有必要设置但是下一个和以前的指针null
日,作为节点由deleteKey
方法返回,我同意你的看法:它会更好,将其设置为null
并防止任何内存泄漏。这段代码的另一个问题是,如果该列表是空的,first
会为空,while表达式会抛出NPE。
您不需要设置下一个和以前的零电流为节点从列表中删除。
记住要遍历一个双向链表的唯一方法是开始在第一或头节点和继续,直到所需的节点或最后一个/尾节点。如果你想删除一个节点,你只是链接这是以前到它的下一个节点,反之亦然。
话虽这么说,这是没有错的设置被删除节点的下一个和以前为空,因为这会阻止您遍历通过该节点的参考名单。