繁体   English   中英

双向LinkedList Java

[英]Doubly LinkedList Java

这是一个带有sortedAdded和sortedRemove方法的双链表。 当我运行代码时,它将引发“空点异常”。 我知道例外在“ 43”行,但我不知道如何解决。 我曾在该网站上发表过一篇文章,介绍了如何“防止空值异常”,但仍然做得不好。 这是我的代码:

public class DoublyLinkedList<Item extends Comparable> {

private class Node{
    private Item item;
    private Node next;
    private Node prev;

    public Node getNext() {
        return next;
    }

    public Node getPrev(){
        return prev;
    }

    public Item getItem(){
        return item;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public void setPrev(Node prev){
        this.prev= prev;
    }

    public void setItem(Item item){
        this.item = item;
    }
}

private Node head;
private int numberOfEelements;

public void sortedAdd(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
        current = current.getNext();
    Node temp = new Node();
    temp.setNext(current);
    temp.setPrev(current.getPrev());
    (current.getPrev()).setNext(temp);
    current.setPrev(temp);
    temp.setItem(newItem);
    ++numberOfEelements;
}

public void sortedRemove(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while((newItem.compareTo(current.getItem()) !=0) && (current!= dummy))
        current = current.getNext();

    if (newItem.equals(current.getItem())) {
        (current.getPrev()).setNext(current.getNext());
        (current.getNext()).setPrev(current.getPrev());
        --numberOfEelements;
    }
}

public static void main(String[] args) {

    DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();

        list.sortedAdd(1);
        list.sortedAdd(5);
        list.sortedAdd(7);
        list.sortedAdd(9);
        list.sortedAdd(3);
        list.sortedAdd(2);

        System.out.println(list);

        list.sortedRemove(3);
        list.sortedRemove(7);

        System.out.println(list);

        list.sortedRemove(4);
}
}

这是我得到的错误:

Exception in thread "main" java.lang.NullPointerException
    at DoublyLinkedList.sortedAdd(DoublyLinkedList.java:43)
    at DoublyLinkedList.main(DoublyLinkedList.java:74)

在sortedAdd中,您不处理head == null(在这种情况下意味着空列表)的初始情况。 因此,在这一行中dummy.getNext(); 您正在对null引用调用getNext。

为创建一个空头添加一个检查将使您克服此错误:

public void sortedAdd(Item newItem) {

    if (head == null) {
        head = new Node();
        head.setItem(newItem);
        ++numberOfEelements;
        return;
    }

尽管由于循环逻辑的原因,您将再碰到另一个NPE。

为了打印列表,您将需要添加toString()方法:

public String toString(){
    Node current = head;
    StringBuilder sb = new StringBuilder();
    while(current != null){
        sb.append(current).append(" ");
        current = current.getNext();
    }
    return sb.toString();
}

使用DoublyLinkedList方法创建类型为DoublyLinkedListObject

DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();

head初始化为null并且numberOfEelements初始化为0;

DoublyLinkedList类中添加以下initializer

   {
         head = new Node();
         head.setNext(head);
         head.setPrev(head);
         head.setItem(null);
         numberOfEelements =0;
    }

public class DoublyLinkedList<Item extends Comparable> {    
    {
      head = new Node();
      head.setNext(head);
      head.setPrev(head);
      head.setItem(null);
      numberOfEelements =0;
    }
 private class Node{
    private Item item;
    private Node next;
    private Node prev;

    public Node getNext() {
        return next;
    }

    public Node getPrev(){
        return prev;
    }

    public Item getItem(){
        return item;
    }

    public void setNext(Node next) {
        this.next = next;
    }


    public void setPrev(Node prev){
        this.prev= prev;
    }

    public void setItem(Item item){
        this.item = item;
    }
}

private Node head;
private int numberOfEelements;

public void sortedAdd(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
        current = current.getNext();
    Node temp = new Node();
    temp.setNext(current);
    temp.setPrev(current.getPrev());
    (current.getPrev()).setNext(temp);
    current.setPrev(temp);
    temp.setItem(newItem);
    ++numberOfEelements;
}

public void sortedRemove(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while((newItem.compareTo(current.getItem()) !=0) && (current!= dummy))
        current = current.getNext();

    if (newItem.equals(current.getItem())) {
        (current.getPrev()).setNext(current.getNext());
        (current.getNext()).setPrev(current.getPrev());
        --numberOfEelements;
    }
}

首先,当您在类Node结束之后初始化head时,请将初始化替换为: private Node head=null;

现在使用以下代码:

public void sortedAdd(Item newItem) {
    Node dummy = head;
    if(dummy==null)
    {
        head = new Node();
        head.setItem(newItem);
        head.setNext(null);
        head.setPrev(head);

    }
    else
    {
        Node current = dummy.getNext();
        while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
            current = current.getNext();
        Node temp = new Node();
        temp.setNext(current);
        temp.setPrev(current.getPrev());
        (current.getPrev()).setNext(temp);
        current.setPrev(temp);
        temp.setItem(newItem);
    }
    ++numberOfEelements;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM