如何从Java中的链接列表中删除?

时间:2017-05-21 20:36:47

标签: java list

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

现在,我正在尝试删除条目,但该功能无效。

我知道这个概念:

  • 搜索保留上一个节点的节点;
  • 告诉上一个节点指向下一个节点;
  • 返回或停止使用该节点,以便GC删除它。

由于某种原因,它不起作用。我可以一遍又一遍地删除具有相同值的节点。我担心它与Java指针有关。

代码:

节点:

public class SimpleNode<E> {

    private E value;
    private SimpleNode<E> next;

    public SimpleNode() {
        this.value = null;
        this.next = null;
    }

    public NoSimples(E data, SimpleNode<E> ref) {
        this.value = data;
        this.next = ref;
    }
// Getters and Setters
}

列表:

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.
}

1 个答案:

答案 0 :(得分:1)

多个问题:

  1. 想想你是否有一个列表1,2,3,4。现在,如果您尝试删除1,则代码会失败。
  2. nodeAnt = node应为nodeAnt = nodeAnt.getNext()。请记住,所有参考文献,不是对象
  3. 此外,递归方式可能更容易理解。例如,以下是我实现它的方式

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

    注意:我删除所有出现的元素,因为我需要它。你可能需要它与众不同。