java – 从头开始​​实现Doubly Linked List,remove()方法中的错误

我试图学习在
java中实现Doubly Linked List作为练习.

但我被困在remove()方法.

列表的内容是,

1 2 3 4

当我尝试删除不存在的元素时.它在行号处显示NullPointerException. 21而不是找不到打印.

我看到的其他代码有点复杂,与我正在做的不同.
方法是,

 void remove(int data){
    Node n = head;
    if(head==null)
        System.out.println("Not Found");
    else if(head.d==data){
        if(head==tail){
            head=null;
            tail=null;
        }
        else{
            head=head.next;
            head.prev=null;
        }
    }
    else{
        while(n!=null && n.d==data){
            n=n.next;
        }
        if(n==tail){
            tail=tail.prev;
            tail.next=null;
        }
        else if(n!=null){
            n.prev.next=n.next;
            n.next.prev=n.prev;
        }
        if(n==null)
            System.out.println("Not Found");
    }
}

所以我的问题是,
我完全错了吗?
或者问题是什么?
请原谅我,如果它太愚蠢了.

最佳答案 问题在于搜索逻辑.在while循环条件中,“n.d == data”不正确.它应该是“n.d!= data”,即

while(n!= null&& n.d == data){
            N = n.next;
        }

应该:

...

    while(n!=null && n.d != data){
        n=n.next;
    }

这是一个更清洁的实现:

public void remove(int data) { // Head is not required in param, should be field variable
    Node ptr = head;

    while(ptr!=null && ptr.data != data) // search for the node
    {
        ptr = ptr.next;
    }

    if(ptr == null) {
        System.out.println("Not Found");
        return;
    }

    if(ptr.prev == null) {// match found with first node
        head = ptr.next;
    }
    else{
        ptr.prev.next = ptr.next;
    }
    if(ptr.next == null){// match found with last node
        tail = ptr.prev;
    }
    else{
        ptr.next.prev = ptr.prev;
    }       
}
点赞