如何从通用双链表中删除

时间:2016-12-30 15:49:12

标签: java generics doubly-linked-list

我正在尝试构建一个删除功能,以从列表中删除特定的器官。 我收到NullPointerException错误 我想知道我的错误是什么。 为什么我收到此错误。 感谢。

  

删除特定器官的方法。该方法返回已删除的器官,器官实验室不在列表中,它返回null

import java.util.ListIterator;
import java.util.NoSuchElementException;

public class LinkedListDouble<T> {
    private LDNode<T> head;
    private LDNode<T> tail;
    public int size;


LinkedListDouble(){
    this.head = null;
    size = 0;
}


public void add(T item){ // add item to the list
    if(head == null ){
        head = new LDNode<T>(item,null,null);
    }
    else{
        LDNode<T> n = new LDNode<T>(item, null, null);
        while(n.next != null ){
            n = n.next;
        }
        n.next = new LDNode<T>(item,n,null);
    }size++;
}

public T remove(T item){ // remove item from the list
    T ans=null;
    LDNode<T> n = head;
    int i=0;

    while(n.data != item){
        n = n.next;
        i++;
    }
    if(i == size) return null;
    if(n == head) {
        ans = head.data;
        head.prev.next = head.next;
        head.next.prev = head.prev;
        head = head.next;
    }
    else {
        ans = n.data;
        n.prev.next = n.next;
        n.next.prev = n.prev;
    }
    size--;
    return ans;

    }

public int size(){
    return size;
}

节点

public class LDNode<T> {
T data;
LDNode<T> next,prev;


LDNode(){
    next = null;
    prev = null;
    data = null;
}

/*LDNode(T data){
    this(data,null,null);
}*/
LDNode(T data , LDNode<T> next , LDNode<T> prev){
    this.data = data;
    this.next = next;
    this.prev = prev;
}
LDNode(LDNode<T> Other){
    this.data = Other.data;
    this.next = Other.next;
    this.prev = Other.prev;
}

T getData(){
    return data;
}

public void setNextNode(LDNode<T> next){
    this.next = next;
}
public LDNode<T> getPrevNode(){
    return prev;
}
public void setPrevNode(LDNode<T> prev){
    this.prev = prev;
}
public void setData(T data){
    this.data = data;
}
public LDNode<T> getNextNode(){
    return next;
}

}

主要

    public static void main(String[] args) {
    LinkedListDouble<Integer> itay = new LinkedListDouble<>();
    itay.add(1);
    itay.add(2);
    itay.add(3);
    itay.add(4);
    itay.add(5);
    itay.add(6);
    System.out.println(itay.size());
    itay.remove(1);
    System.out.println(itay.size());
}

错误:

Exception in thread "main" java.lang.NullPointerException
at Matala2.LinkedListDouble.remove(LinkedListDouble.java:45)//head.prev.next = head.next;
at Matala2.LinkedListDouble.main(LinkedListDouble.java:78) //itay.remove(1);

1 个答案:

答案 0 :(得分:1)

第一个预见的问题是add类的LinkedListDouble方法。看,您正在创建head,之后不要将其与LDNode类的任何其他实例相关联。因此,head总是nullprev,这就是您获得NPE的原因。此外,add方法中的代码永远不会将null与[{1}}对象的prev值区别开来。请考虑修改LDNode类的add方法。