我必须制作自己的双链表。我是初学者,所以请原谅我缺乏知识。这个列表必须实现List java接口,所以我有一个remove(int),一个remove(Object)和一个clear()方法,其中clear()方法不能正常工作,这意味着它不会删除列表中的所有元素,只会删除一些元素。
这是clear()方法:
public void clear() {
for (T t : this) {
this.remove(t);
}
this.remove(this.size);
}
remove(Object)方法:
public boolean remove(Object o) {
if (this.indexOf(o) >= 0){
remove(this.indexOf(o));
return true;
}
return false;
}
最后,删除(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;
}
请不要只指出错误的位置,还要帮助我改进此代码,如果可以的话。谢谢你的努力!
答案 0 :(得分:4)
您的clear()
方法非常可疑,因为它会在迭代该列表时从List
中删除一个元素。如果您尝试使用其中一个内置List
实现,那么您将获得ConcurrentModificationException
。实际上很难实现能够正确处理这类事情的List
。
在任何情况下,我通常都希望Java链表的clear()
方法简单地使列表对任何节点的引用无效,就像你的remove(int)
方法删除你的唯一元素一样。名单。 clear()
应该能够做同样的事情,而不考虑列表的内容。
已编辑添加:
具体来说,既然你问过,看起来你可以使用
public void clear() {
this.firstNode = null;
this.lastNode = null;
this.size = 0;
}
(使用this.
是不必要的,我通常不会这样做,但我正在遵循其他代码的风格。)请注意,我没有足够的信息来确定这是100%正确且足以满足您的实施需求,这就是我最初没有包含特定代码的原因。