如何在Java中从链表中删除?

如何在Java中从链表中删除?,java,list,Java,List,因此,作为家庭作业的一部分,我用Java编写了自己的链表(和列表节点) 现在,我正在尝试删除条目,但函数不起作用 我知道这个概念: 搜索保留上一个节点的节点 告诉上一个节点指向下一个节点 返回或停止使用节点,以便GC擦除它 由于某种原因,它不起作用。我可以一次又一次地删除具有相同值的节点。恐怕这与Java指针有关 守则: 节点: 公共类SimpleNode{ 私人股本价值; 私有SimpleNode next; 公共SimpleNode(){ this.value=null; this.ne

因此,作为家庭作业的一部分,我用Java编写了自己的链表(和列表节点)

现在,我正在尝试删除条目,但函数不起作用

我知道这个概念:

  • 搜索保留上一个节点的节点
  • 告诉上一个节点指向下一个节点
  • 返回或停止使用节点,以便GC擦除它
由于某种原因,它不起作用。我可以一次又一次地删除具有相同值的节点。恐怕这与Java指针有关

守则:

节点:

公共类SimpleNode{
私人股本价值;
私有SimpleNode next;
公共SimpleNode(){
this.value=null;
this.next=null;
}
公共NoSimples(E数据,SimpleNode参考){
这个值=数据;
this.next=ref;
}
//接球手和接球手
}
名单:

公共类LinkedList实现了Iterable{
私人单纯形头;
私有整数大小=0;
公共链接列表(){
this.head=新的SimpleNode();
}
公共void添加(SimpleNode节点){
this.addFirst(node.getValue());
}
公共无效添加优先(E项){
SimpleNode nonde=新的SimpleNode(项目,this.head);
this.head=节点;
大小++;
}
公共无效添加(E值){
此.addFirst(值);
}
公共SimpleNode removeFirst(){
SimpleNode节点=this.head;
if(node==null){
返回null;
}否则{
this.head=node.getNext();
node.setNext(空);
这个尺寸--;
返回节点;
}
}
公共SimpleNodes删除(E值){
SimpleNode nodeAnt=this.head;
SimpleNode节点=this.head.getNext();
while(节点!=null){
如果(node.getValue()!=null&&node.getValue().equals(value)){
setNext(node.getNext());
node.setNext(空);
返回节点;
}
nodeAnt=节点;
node=node.getNext();
}
返回null;
}
//其他不相关的方法。
}
多个问题:

  • 如果你有一个列表
    1,2,3,4
    。现在,如果您试图删除
    1
    ,代码将失败
  • nodeAnt=node
    应该是
    nodeAnt=nodeAnt.getNext()
    。记住,它们都是引用,不是对象
  • 此外,递归方法可能更容易理解。例如,下面是我如何实现它的

    public void remove(E e){
        prev = head;
        removeElement(e, head);
        System.gc();
    }
    
    private void removeElement(E e, Node currentElement) {
        if(currentElement==null){
            return;
        }
        if(head.getData().equals(e)){
            head = head.getNext();
            size--;
        }else if(currentElement.getData().equals(e)){
            prev.setNext(currentElement.getNext());
            size--;
        }
        prev = prev.getNext();
        removeElement(e, currentElement.getNext());
    
    }
    

    注意:我根据需要删除元素的所有引用。您可能需要它有所不同。

    Java中的概念是,如果一个对象没有更多的引用,那么GC最终会清理它。在您的情况下,只需从LinkedList中删除该对象即可。要从LinkedList中删除,您只需从迭代器中迭代and调用.remove()。是的,但我在上面的代码中尝试这样做,但它不起作用。您似乎跳过了删除中的第一个节点:
    nodeAnt=this.head
    。这意味着第一个节点在你看它之前就已经是“前”节点了。虽然“它不工作”是各种问题和错误报告中的经典错误描述,但它并没有太大帮助……请解释一下。System.GC真的有必要吗?实际上,没有。完全取决于JVM何时释放内存,但我还是添加了它。没什么区别@如果设置“-XX:+DisableExplicitGC”并进行一些更改,则将忽略TiagoSiriousSystem.gc()。请更正算法(例如,添加prev的instantiation),以便我可以接受答案。@TiagoSirious我不理解你的意思。我的代码失败了吗?你能告诉我它失败的测试用例吗?
    public class LinkedList<E> implements Iterable<SimpleNode<E>> {
    
        private SimpleNode<E> head;
        private int size = 0;
    
        public LinkedList() {
            this.head = new SimpleNode<E>();
        }
    
        public void add(SimpleNode<E> node) {
            this.addFirst(node.getValue());
        }
    
        public void addFirst(E item) {
            SimpleNode<E> nonde = new SimpleNode<E>(item, this.head);
            this.head = node;
            size++;
        }
    
        public void add(E value) {
            this.addFirst(value);
        }
    
        public SimpleNode<E> removeFirst() {
            SimpleNode<E> node = this.head;
            if (node == null) {
                return null;
            } else {
                this.head = node.getNext();
                node.setNext(null);
                this.size--;
                return node;
            }
        }
    
        public SimpleNodes<E> remove(E value) {
            SimpleNode<E> nodeAnt = this.head;
            SimpleNode<E> node = this.head.getNext();
            while (node != null) {
                if (node.getValue()!= null && node.getValue().equals(value)) {
                    nodeAnt.setNext(node.getNext());
                    node.setNext(null);
                    return node;
                }
                nodeAnt = node;
                node = node.getNext();
            }
            return null;
        }
    // Other irrelevant methods.
    }
    
    public void remove(E e){
        prev = head;
        removeElement(e, head);
        System.gc();
    }
    
    private void removeElement(E e, Node currentElement) {
        if(currentElement==null){
            return;
        }
        if(head.getData().equals(e)){
            head = head.getNext();
            size--;
        }else if(currentElement.getData().equals(e)){
            prev.setNext(currentElement.getNext());
            size--;
        }
        prev = prev.getNext();
        removeElement(e, currentElement.getNext());
    
    }