【问题标题】:Creating a Doubly Linked List from extending from a Singly Linked List - getting Null Pointer从单链表扩展创建双链表 - 获取空指针
【发布时间】:2014-11-29 10:45:03
【问题描述】:

我一直在尝试利用我之前制作的单链表来创建一个双链表。因此,在 Node 类中,我添加了先前的节点引用并更新了 List 类中的 addinsert 方法,以适应在 DoublyLinked 列表类中来回切换。 add 将新节点置于当前节点之后,insert 将新节点置于List 类中的当前节点之前;这是因为我想在DoublyLinked 列表类中按升序添加和插入我的值。 [这可能听起来令人困惑,但我将在下面发布代码] 当我测试我的 add 方法时 [在 DoublyLinked 类中] 我得到一个空指针异常。

正如我所说,我已经为此工作了几天,所以在那段时间里我考虑了这些以前的问题:

  1. How do I change a singly-linked list to a doubly-linked list?
  2. Singly linked list to doubly linked list
  3. Null pointer when using doubly linked list

List.java

public class List<T> implements ListInterface<T> {
        protected class Node {
        private T value = null;
        private Node prev = null;
        private Node next = null;

        public T getValue( ) {
            return value;
        }

        public Node getPrev( ) {
            return prev;
        }

        public Node getNext( ) {
            return next;
        }

        public void setValue( T newValue ) {
            value = newValue;
        }

        public void setPrev( Node prevNode ) {
            prev = prevNode;
        }

        public void setNext( Node nextNode ) {
            next = nextNode;
        }
    }

    protected Node head = null;
    protected Node cur  = null;
    protected int      size = 0;

    // add after cur
    @Override
    public void add( T value ) {
        Node temp = new Node( );
        temp.setValue( value );
        size++ ;
        if (isEmpty( )) {
            head = temp;
            cur = temp;
        } else {
            temp.setNext(cur.getNext());
            temp.setPrev(cur);
            cur.setNext(temp);
            cur = temp;
        }
    }

    // insert before cur
    @Override
    public void insert( T value ) {
        Node temp = new Node( );
        temp.setValue( value );
        size++ ;
        if (isEmpty( )) {
            head = temp;
            cur = temp;
        } else if (head == cur) {
            head = temp;
            head.setNext( cur );
            cur.setPrev(head);
            cur = head;
        } else {
            Node prev = head;
            while( prev.getNext( ) != cur ) {
                prev = prev.getNext( );
            }
            temp.setNext( prev.getNext( ) );
            temp.setPrev(prev);
            prev.setNext( temp );
            cur = temp;
        }
    }
}

DoublyLinked.java

public class DoublyLinked<T extends Comparable<T>> 
extends List<T> implements ListInterface<T> {

    private int size;
    private Node tail;

    DoublyLinked() {
        this.size = 0;
        this.tail = null;
    }

    @Override
    public void add(T value) {
        size++;

        reset();
        // getting Null pointer on add when doublinked list is empty
        if(isEmpty()) {
            super.add(value);
            head = cur;
            tail = head;
            cur = head;
        }
        else {
            try {
                while(value.compareTo(get()) > 0 && hasNext()) { // error here
                    next();
                    if(value.compareTo(get()) <= 0) {
                        super.add(value);
                        // how to set cur to this new node?
                    }
                }
            } catch (EmptyListException | EndOfListException e) {}  
            super.add(value); // add at end of list
            tail = cur;
            cur = tail;
        }
    }

    @Override
    public T get() throws EmptyListException {
        return cur.getValue();
    }

    @Override
    public T next() throws EmptyListException, EndOfListException {
        if (!hasNext( )) {
            throw new EndOfListException( );
        }
        cur = cur.getNext( );
        return cur.getValue( );
    }

    @Override
    public boolean hasNext() {
        return((!isEmpty()) && (cur.getNext() != null));
    }

    @Override
    public void reset() {
        cur = head;
    }

    @Override
    public boolean isEmpty() {
        return size ==  0;
    }
}

然后我有一个基本的JUnit测试来测试代码:

import static org.junit.Assert.*;

import org.junit.Test;


public class DoublyLinkedTest {

    @Test
    public void testAdd() {
        DoublyLinked<Integer> list = new  DoublyLinked<Integer>();
        list.add(1);
    }
}

【问题讨论】:

    标签: java list linked-list nodes doubly-linked-list


    【解决方案1】:

    您增加size,然后调用isEmpty()(检查size 是否为零)来决定如何添加项目:

        size++ ;
        if (isEmpty( )) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2013-12-10
      相关资源
      最近更新 更多