任何人都可以帮我解决这个问题吗?我正在尝试首次实现双向链表,并且试图让我的代码适用于我的删除类时感到很沮丧:
public void remove(int data) {
if(length == 0) {
return;
}
if (head.data == data){
head = head.next;
length--;
}
Node current = head;
while (current != null) {
if(current.data != data) {
current = current.next;
length--;
}
current = current.next;
}
}
我知道之前可能已经提出过这个问题,但我无法理解其他人代码的差异,因为它更加复杂。这是一个非常艰难的一天,试图让这个方法工作而不会得到NullPointerException,并且将不胜感激!感谢。
答案 0 :(得分:0)
您想删除单个节点或前列表的一部分吗?
如果您尝试删除单个节点,则current
节点将用作指向要查找要删除的节点的指针,当您找到此节点时,您可以更改节点的值,如果这是最后一个元素,您可以将上一个节点的下一个节点设置为null,否则将前一个节点的下一个节点设置为该节点的下一个节点,并将该节点的下一个节点的上一个节点更改为该节点的上一个节点。
public void remove(int data) {
if(length == 0) {
return;
}
if (head.data == data){
head = head.next;
length--;
}
Node current = head;
while (current != null) {
if (current.data != data) {
current = current.next;
} else {
if (current.next == null) {
current.pre.next = null;
} else {
current.pre.next = current.next;
current.next.pre = current.pre;
}
length--;
}
}
}
答案 1 :(得分:0)
试试这个:
public void remove(int data) {
if (isEmpty()) {
throw new NoSuchElementException();
}
if (this.size == 1 && this.head.getData() == data) {
this.head = this.tail = null;
this.size--;
return;
}
if (this.head.getData() == data) {
this.head = this.head.getNext();
this.head.setPrevious(null);
this.size--;
return;
}
if (this.tail.getData() == data) {
this.tail = this.tail.getPrevious();
this.tail.setNext(null);
this.size--;
return;
}
for (Node<T> current = this.head; current != null; current = current.getNext()) {
if (current.getData() == data) {
Node<T> previous = current.getPrevious();
Node<T> next = current.getNext();
previous.setNext(next);
next.setPrevious(previous);
this.size--;
return;
}
}
throw new NoSuchElementException();
}