我也试图通过用户输入的索引删除双向链表中的节点。这似乎对我有意义,但在“删除节点”并重新打印列表的内容后,没有任何改变。我确定这是一件让我失踪的蠢事。有什么建议吗?
public void removeEntryNode() {
System.out
.println("We delete by index here. Type in the number you want to delete");
// print list for selection
temp = head;
while (temp != null && temp.getFirstName() != null) {
System.out.print(temp.getIndex() + " " + temp.getFirstName() + " ");
System.out.print(temp.getLastName() + " ");
System.out.println(" ");
temp = temp.getNext();
}
int selection = keyboard.nextInt();
// Gets node matching index with selection and deletes it
// Next two lines loop through list
while (temp != null && temp.getIndex() != selection) {
temp = temp.getNext();
}
// if it is the head
if (selection == 0) {
head = temp.getNext();
temp.getNext().setPrev(null);
temp.setNext(null);
counter--;
}
// if it is the tail
else if (selection == size()) {
tail = temp.getPrev();
temp.setPrev(null);
temp.setNext(null);
temp.getPrev().setNext(null);
counter--;
} else {
temp.getPrev().setNext(temp.getNext());
temp.getNext().setPrev(temp.getPrev());
temp.setNext(null);
temp.setPrev(null);
counter--;
}
System.out.println("Successfully deleted ");
menu();
}
答案 0 :(得分:3)
如果不看完整个代码,就无法确定问题。
尽管如此,我会给你一些指示:
<强> 1 强>
... temp.getIndex() != selection ...
链表中的元素跟踪自己的索引通常不是一个好主意。为了保持索引的正确性,每次插入或删除都需要遍历列表才能更新索引。
<强> 2 强>
else if (selection == size()){
这里可能存在一个错误的错误。
第3 强>
temp.setPrev(null);
temp.setNext(null);
temp.getPrev().setNext(null);
最后一行保证会抛出NullPointerException
。
一旦解决了这些问题,我建议您在调试器中逐步执行程序,看看实际发生的是您希望在每一步中发生的事情。
答案 1 :(得分:1)
在列出临时指针指向列表末尾的所有元素之后,在搜索元素之前,应该使临时指针再次指向头部。
temp = head;
//Gets node matching index with selection and deletes it
//Next two lines loop through list
while (temp!=null && temp.getIndex() != selection) {
temp = temp.getNext();
}
答案 2 :(得分:1)
双链表有两个指针,它是前一个,下一个是。
如果您要删除该节点,请确保将previous.next指向节点的下一个节点,并将next.previous设置为节点的前一节点。
关于保持索引值,我也不同意,但如果你能完美地做到这一点就没关系。