这是我的代码:
public boolean remove(T item) {
int index = 0;
if(contains(item)){
Node<T> current = first.getNext();
for(int i = 0; i<size; i++){
if((current.getData()).equals(item)){
index = i; //this will be the index of the item to be removed
}
current = current.next;
}
current.setData(null);
System.out.println(index);
System.out.println(size);
for(int i = index; i < size; i++){
if(i < size){
current.setData(current.next.getData());
current = current.next;
}
if(i == size)
current = last;
}
size--;
return true;
}else{
return false;
}
}
if和以下for循环的第一部分通过遍历列表找到希望删除的项的索引,直到找到它为止。这部分有效。
当前要删除的项目现在设置为空(不要认为这是必要的吗?)
索引和尺寸的打印仅用于测试。
然后我有一个我觉得很简单的for循环,它将每个项目设置为下一个项目,直到它到达结尾,有效地将列表缩小一个并在其找到的索引处删除所需的项目。
但是,我在行current.setNext(current.next)处获得空指针异常。如果此代码仅在i&lt;大小,然后我不确定为什么会这样。我希望我能用这种方法走上正轨。
如果它能让你更容易提供帮助,我可以发布课程的其余部分。
非常感谢。
答案 0 :(得分:4)
你正在做for(int i = index; i <= size; index++)
注意<=
。 NullPointerException
的原因始终相同 - 引用为null
。基于此调试它;你最了解你的代码。
答案 1 :(得分:0)
一些问题:
1
current.setNext(current.next);
您没有推进索引,因此您基本上设置了对自身的引用。
2
为什么要拨打if(contains(item))
然后再次查找该项目?我只是一气呵成。
3
for(int i = 0; i<size; i++){
if((current.getData()).equals(item)){
index = i; //this will be the index of the item to be removed
}
current = current.next;
}
如果您找到了仍在调用current = current.next;
的节点,那么current
将指向您想要获取的节点之后的节点。我假设您要在条件块中添加break;
。
4
for(int i = index; i <= size; index++){
你应该增加i
而不是index
,否则循环本身永远不会终止。
5
编辑后你有这个:
for(int i = index; i <= size; index++){
if(i < size){
current.setData(current.next.getData());
current = current.next;
}
...
这里你有一次迭代太多了。再次假设列表A,B,C。此处size
为3,当您移除B时,您会获得index = 1
。
现在你迭代i = 1; i <= 3; i++
。 (我假设你在这里修正了第4条)
因此,在第一次迭代后current
将指向C并且i
将为2.因此,您再次执行if-block并调用我认为将current.next.getData()
导致NPE,因为C没有下一个节点。