gpt4 book ai didi

java - java中删除双向链表中的两个节点时出错

转载 作者:行者123 更新时间:2023-12-02 00:08:19 26 4
gpt4 key购买 nike

我在双向 LinkedList 中遇到问题,并且我没有使用尾部,而是使用当前指针。当我使用尾部时,我没有发现问题,但是当我使用当前指针时,我收到错误并且无法解决它。当我删除节点时会发生这种情况。我的程序正在运行,但我无法删除下一个节点。这是错误消息:

这是 DNode 类

public class DNode<T> { 
T data;
DNode<T> next;
DNode<T> prev;
public DNode(T e){
data = e;
next = prev = null;
}

此类 DoubleLinkedList

public class DoubleLinkedList<T> {

DNode<T> head;
DNode<T> current;
int size = 0;
public DoubleLinkedList() {
head = current = null;
}
public void Insert(T e) {
DNode<T> tmp = new DNode(e);
if (size == 0) {
head = current = tmp;
} else {
tmp.next = current.next;
tmp.prev = current;
current.next = tmp;
current = tmp;

}
size++;
}

public void remove() {
if (head == current) {
if (current.next == null) {
head = current = null;
} else {
current.next.prev = null;
head = current.next;
current.next = null;
current = head;
}
} else {
DNode<T> tmp = current.next;

current.prev.next = tmp;
if (tmp != null) {
tmp.prev = current;
}
current.next = current.prev = null;
current = tmp;
}

size--;

}

主类

public static void main(String[] args) {
DoubleLinkedList<String> d = new DoubleLinkedList();


d.Insert("jon");
d.Insert("jack");
d.Insert("mohammed");
d.remove();
d.remove();// here my problem
}

带有注释的行是我收到错误的地方。

最佳答案

在删除函数的 else 部分中,将 current 分配给 tmp。当您说 current = tmp; tmp 可能为 null。因此,下次调用删除时,如果它进入 else 子句(在您的情况下),current 将为 null,并且 current.next 给出空指针异常。

编辑:这将是一个可能的建议:

/*Deletes the last node in the list*/
public void remove() {
if(head == null || size == 0) return; // Empty list
if(head == current || size ==1){ // List with only one node
head = null;
current = null;
size--;
return;
}
DNode<T> previous = current.prev;
previous.next = current.next;
current.prev = null;
current = previous;
size--;
}

关于java - java中删除双向链表中的两个节点时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com