删除多个节点时遇到问题。
如果我选择这样的节点,我可以删除它们:
但如果我这样做,我就无法删除它们:
我的代码:
public boolean remove(ProductNode<E> data) {
if (isEmpty()) {
throw new NoSuchElementException();
}
for (ProductNode<E> current = this.head; current != null; current = current.next) {
ProductNode<E> pre = current.prev;
ProductNode<E> next = current.next;
if (data != null) {
if (current.data.equals(data.data)) {
if (pre == null) {
head = next;
current.next = null;
} else {
if (next != null) {
next.prev = pre;
}
}
if (next == null) {
pre.next = null;
current.prev = null;
tail = pre;
} else {
if (pre != null) {
pre.next = next;
}
}
}
}
}
size--;
return false;
}
搜索节点
public ProductNode<E> search(E data) {
for (ProductNode<E> current = this.head; current != null; current = current.next) {
if (current.data.equals(data)) {
return current;
}
}
return null;
}
删除
public void remove(E e) {
remove(search(e));
}
删除:
for(Tab_Product p : remove_list){
List_Products.list_products.remove(p);
}
答案 0 :(得分:0)
您的删除功能(ProductNode数据)有点复杂,可能会影响您的代码删除多个节点的能力。对于此删除功能,您不需要遍历整个数据集。如果您已经有对节点的引用,则可以直接使用它修改列表。
public boolean remove(ProductNode<E> data) {
if (isEmpty()) {
throw new NoSuchElementException();
}
ProductNode<E> pre = data.prev;
ProductNode<E> next = data.next;
//First remove the nodes references to its neighbors.
data.prev = null;
data.next = null;
// Now check the neighbors and update their references
// to remove all references to the deleted node.
if (pre != null) pre.next = next;
if (next != null) next.prev = pre;
if (data == head) { //This checks the actual memory address.
head = next;
}
size--;
}
由于您已拥有ProductNode,因此无需搜索列表。你的search()函数已经为你做了。因为你已经拥有了你只需要对它的邻居进行引用的节点,所以你只需要访问邻居(如果有的话)并让它们的旧引用跳过已删除的节点。
我注意到一些引用错误,其中删除的节点没有从列表中完全删除,但我不会提及它们,因为这个删除功能相当复杂。尝试简化删除功能,然后查看结果。
如果向我们展示List_Products对象的结构,它也可能会有所帮助。
此外,您应该验证您在UI中选择的数据是否正确传递。这可能是一个UI错误。