2014-10-04 2 views
1

Я пытаюсь использовать свой предыдущий сделанный отдельно связанный список, чтобы создать двусвязный список. Таким образом, в классе Node я добавил ссылку на предыдущие узлы и обновил методы add и insert в классе List для размещения взад и вперед в классе списка 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); 
    } 
} 

ответ

0

Вы инкремент size, а затем вызвать isEmpty() (который проверяет, является ли size равна нулю), чтобы решить, как добавить товар:

size++ ; 
    if (isEmpty()) { 
Смежные вопросы