Я пытаюсь использовать свой предыдущий сделанный отдельно связанный список, чтобы создать двусвязный список. Таким образом, в классе Node я добавил ссылку на предыдущие узлы и обновил методы add
и insert
в классе List
для размещения взад и вперед в классе списка DoublyLinked
. add
ставит новый узел после текущего узла, а insert
ставит новый узел перед текущим узлом в классе List
; это потому, что я хочу добавить и вставить мои значения в порядке возрастания в класс списка DoublyLinked
. [Это может показаться запутанным, но я опубликую код ниже] Когда я тестирую свой метод add
[в классе DoublyLinked
], я получаю исключение с нулевым указателем.Создание двойного связного списка из продолжения из единого связанного списка - получение нулевого указателя
Как я сказал, что я работал над этим в течение нескольких дней, так что в то время я принял во внимание эти предыдущие вопросы:
- How do I change a singly-linked list to a doubly-linked list?
- Singly linked list to doubly linked list
- 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);
}
}