双链表中的删除方法不起作用?

时间:2018-03-30 00:49:16

标签: java list

任何人都可以帮我解决这个问题吗?我正在尝试首次实现双向链表,并且试图让我的代码适用于我的删除类时感到很沮丧:

public void remove(int data) {
    if(length == 0) {
        return;
    }
    if (head.data == data){
        head = head.next;
        length--;
    }
    Node current = head;
    while (current != null) {
        if(current.data != data) {
            current = current.next;
            length--;
        }
        current = current.next;
    }
}

我知道之前可能已经提出过这个问题,但我无法理解其他人代码的差异,因为它更加复杂。这是一个非常艰难的一天,试图让这个方法工作而不会得到NullPointerException,并且将不胜感激!感谢。

2 个答案:

答案 0 :(得分:0)

您想删除单个节点或前列表的一部分吗? 如果您尝试删除单个节点,则current节点将用作指向要查找要删除的节点的指针,当您找到此节点时,您可以更改节点的值,如果这是最后一个元素,您可以将上一个节点的下一个节点设置为null,否则将前一个节点的下一个节点设置为该节点的下一个节点,并将该节点的下一个节点的上一个节点更改为该节点的上一个节点。

 public void remove(int data) {
    if(length == 0) {
        return;
    }
    if (head.data == data){
        head = head.next;
        length--;
    }
    Node current = head;
    while (current != null) {
        if (current.data != data) {
            current = current.next;
        } else {
            if (current.next == null) {
                current.pre.next = null;
            } else {
                current.pre.next = current.next;
                current.next.pre = current.pre;
            }
            length--;
        }
    }
}

答案 1 :(得分:0)

试试这个:

public void remove(int data) {
if (isEmpty()) {
    throw new NoSuchElementException();
}
if (this.size == 1 && this.head.getData() == data) {
    this.head = this.tail = null;
    this.size--;
    return;
}
if (this.head.getData() == data) { 
    this.head = this.head.getNext();
    this.head.setPrevious(null);
    this.size--;
    return;
}
if (this.tail.getData() == data) { 
    this.tail = this.tail.getPrevious();
    this.tail.setNext(null);
    this.size--;
    return;
}

for (Node<T> current = this.head; current != null; current = current.getNext()) {
    if (current.getData() == data) {
        Node<T> previous = current.getPrevious();
        Node<T> next = current.getNext();
        previous.setNext(next);
        next.setPrevious(previous);
        this.size--;
        return;
    }
  }
  throw new NoSuchElementException();
}