方法从链接列表中删除对象



我没有看到我的错误,请纠正我!我需要从Linkedlist中删除一个对象。但我在if (current.item.equals(e))中得到了一个错误NPE

public void remove(T e) {
if (first == null) {
throw new IndexOutOfBoundsException("List is empty");
}
if (first.item.equals(e)) {
first = first.next;
first.next.prev = null;
}
if (last.item.equals(e)) {
last = last.prev;
last.prev.next = null;
} else {
Node<T> current = first;
for (int a = 0; a < size; a++) {
current = current.next;
if (current.item.equals(e)) {
current.prev.next = current.next;
current.next.prev = current.prev;
}
}
size--;
System.out.println("Removed");
}
}
Linkedlist<String> list = new Linkedlist<>();
list.put("Maria");
list.put("Ales");
list.put("zina");
list.put("bina");
list.put("fina");

list.remove("zina");

一些问题:

  • 您的代码过于乐观。有几种边界情况需要检查null值。

  • 处理第一个或最后一个节点匹配的代码块会重新连接错误的节点。

  • 当删除第一个或最后一个节点时,size值不进行调整

  • 当没有找到匹配时,size仍然递减。

带注释的更正版本:

public void remove(T e) {
if (first == null) {
throw new IndexOutOfBoundsException("List is empty");
}
if (first.item.equals(e)) {
first = first.next;
// first can be null now!
if (first != null) {
// As you already moved the `first` reference, you should not go to next:
first.prev = null;
}
} else if (last.item.equals(e)) { // make this an else if
last = last.prev;
// As you already moved the `last` reference, you should not go to prev:
last.next = null;
} else {
Node<T> current = first.next;  // can go to next here already
// avoid current to be null, so make it the loop condition
while (current) {
if (current.item.equals(e)) {
current.prev.next = current.next;
current.next.prev = current.prev;
// No need to continue. Just exit here
break;
}
current = current.next;
}
if (current == null) return; // Not found! We should not decrement the size
}
// Size must be decremented here, since it also applies to head/tail removals!
size--;
System.out.println("Removed");
}

备注:

last = last.prev;之后,我们可以确定last不是null。如果是的话,那么last的原始值等于first,那么我们就永远不会得到这里。
  • if (current.item.equals(e)) {块中,我们可以确定current.prevcurrent.next都不为空。如果它们是,那么current将代表第一个/最后一个节点,我们已经得出结论,它们不匹配。

  • 我假设所有节点都保证具有item属性。

  • 我假设最多应该删除一个节点

  • 相关内容

    • 没有找到相关文章

    最新更新