Java 删除SingleLinkedList中的项目

Java 删除SingleLinkedList中的项目,java,object,data-structures,Java,Object,Data Structures,我有一个单链表 a->b->c->d->e a、 b、c、d和e是node类型的对象。我想在遍历列表时删除一个节点,然后使删除的节点成为列表的头部,如下面的代码所示 list.delete(iterator, current); list.addObjectAtFront(current); public void delete(ListIterator li, Node node) { if (li == null) { throw new

我有一个单链表

a->b->c->d->e
a、 b、c、d和e是node类型的对象。我想在遍历列表时删除一个节点,然后使删除的节点成为列表的头部,如下面的代码所示

list.delete(iterator, current);
list.addObjectAtFront(current);


public void delete(ListIterator li, Node node) {
    if (li == null) {
        throw new NullPointerException();
    }

    li.next();
    if (li.previous() != null) {
        li.previous().setNext(node.getNext());
    }

}

public void addObjectAtFront(Object o) {
    Node newNode = new Node(null, o);
    if (this.head != null) {
        newNode.setNext(this.head);
        this.head = newNode;
    } else {
        this.head = this.tail = newNode;
    }
}
调用上述方法时,假设当前项为c。我期待以下几点

list.delete(iterator, current);
Output: a->b->d->e
list.addObjectAtFront(current);
Output: c->a->b->d->e
我有两个相互矛盾的想法

  • 删除后,c不指向任何其他节点,可以在调用第二个方法之前进行垃圾收集

  • c不能被垃圾收集,因为它本身不是空的,并且里面有一些数据。这意味着,如果我不需要使用c;它会一直留在记忆中


  • 以下哪项是正确的,或者我完全弄错了,需要重新理解对象引用

    c不会被垃圾收集,因为“current”正在引用它


    当一个对象没有活动引用时,可以对其进行垃圾收集,但请记住,一个对象可以有多个引用。

    垃圾收集永远不会删除您有任何引用方式的内存(除非您使用

    也就是说,如果您仍然使用该节点,请确保java不会对其进行垃圾收集。作为程序员,您不需要考虑垃圾收集器的行为,除非是为了性能增强。GC不应该影响代码的正确性

    以下哪项是正确的,或者我完全弄错了,需要一个 对对象引用的新理解

    我也不想直接回答。删除时,使用名为
    current
    的节点引用。此引用与c的引用相同。当c被删除时,仍然有引用它的current。然后将当前添加到列表的前面。现在您又有了2个对它的引用,当当前引用从作用域中删除时,您将丢失它,从而使您返回到1个引用


    c永远不会被垃圾收集。

    仅仅因为对象中有数据并不意味着它不会被垃圾收集。垃圾收集将检查您是否持有对它的任何引用。如果您对
    c
    的唯一引用是在链接列表中,并且您将其删除,那么它将被垃圾收集