链表 .clear() 方法无法正常工作

Dor*_*ert -1 java linked-list list

我必须制作自己的双链表。我是初学者,所以请原谅我的知识不足。这个列表必须实现 List java 接口,所以我也有一个 remove(int)、一个 remove(Object) 和一个 clear() 方法,其中 clear() 方法不做它的工作,这意味着它不删除列表的所有元素,只有一些。

这是 clear() 方法:

public void clear() {
    for (T t : this) {
        this.remove(t);
    }
    this.remove(this.size);
}
Run Code Online (Sandbox Code Playgroud)

remove(Object) 方法:

public boolean remove(Object o) {
    if (this.indexOf(o) >= 0){
        remove(this.indexOf(o));
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

最后,remove(int) 方法:

public T remove(int index) {
    if (getNode(index) == null || this.isEmpty()) {
        return null;
    } else if (this.size == 1){
        this.size = 0;
        Node<T> currentNode = this.firstNode;
        this.firstNode = null;
        this.lastNode = null;
        return currentNode.data;
    }

    Node<T> currentNode = this.getNode(index);

    if (currentNode.nextNode != null){
        if (currentNode.previousNode != null){
            currentNode.previousNode.nextNode = currentNode.nextNode;
        } else {
            this.firstNode = currentNode.nextNode;
            this.firstNode.previousNode = null;
            this.size--;
            return currentNode.data;
        }
    }
    if (currentNode.previousNode != null){
        if (currentNode.nextNode != null) {
            currentNode.nextNode.previousNode = currentNode.previousNode;
        } else {
            this.lastNode = currentNode.previousNode;
            this.lastNode.nextNode = null;
            this.size--;
            return currentNode.data;
        }
    }
    currentNode = currentNode.nextNode;
    this.size--;

    for(int i = index; i < this.size-1; i++){
        currentNode = currentNode.nextNode;
        currentNode.index--;
    }

    return currentNode.data;
}
Run Code Online (Sandbox Code Playgroud)

如果可以,请不仅指出错误的位置,还请帮助我改进此代码。谢谢你的努力!

Joh*_*ger 5

您的clear()方法非常可疑,因为它List在迭代列表时从列表中删除了一个元素。如果您尝试使用其中一个内置List实现来做到这一点,您将获得ConcurrentModificationException. 实现一个List可以正确处理这类事情的方法实际上相当困难。

在任何情况下,我通常都希望clear()Java 链表的方法简单地使列表对任何节点的引用无效,就像您的remove(int)方法在删除列表中的唯一元素时所做的那样。 clear()应该能够做同样的事情,而不考虑列表的内容。

编辑添加:

具体来说,既然你问了,看起来你可以使用

public void clear() {
    this.firstNode = null;
    this.lastNode = null;
    this.size = 0;
}
Run Code Online (Sandbox Code Playgroud)

(使用 ofthis.是不必要的,我通常不会这样做,但我遵循您其他代码的风格。)请注意,我没有足够的信息来确定这是 100% 正确且足以满足您的实施,这就是我最初没有包含特定代码的原因。