有人可以看一下java LinkedList的m remove()方法吗?

时间:2014-11-10 16:43:19

标签: java

这是我的代码:

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;大小,然后我不确定为什么会这样。我希望我能用这种方法走上正轨。

如果它能让你更容易提供帮助,我可以发布课程的其余部分。

非常感谢。

2 个答案:

答案 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没有下一个节点。