我正在学习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);
答案 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并没有错,因为这可以防止您通过该节点的引用遍历列表。