双链表java删除

时间:2017-05-25 16:17:35

标签: linked-list

删除多个节点时遇到问题。

如果我选择这样的节点,我可以删除它们:

View

但如果我这样做,我就无法删除它们:

this

我的代码:

    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);
    }

1 个答案:

答案 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错误。