Я новичок в дженериках, и я пытаюсь сделать связанный список.
Вот код для класса Node_.
public class Node_<T> {
private int index;
private T data;
private Node_<T> next;
public Node_() {
}
public Node_(T data, int index) {
this.data = data;
this.index = index;
next = null;
}
public void set(T data, int index) {
this.data = data;
this.index = index;
this.next= null;
}
public void display() {
System.out.println(this.data.toString());
}
public void setindex(int index) {
this.index = index;
}
public void setData(T data) {
this.data = data;
}
public Node_<T> getNext() {
return next;
}
public boolean hasNext() {
if (next != null) return true;
else return false;
}
public int getIndex() {
return this.index;
}
}
и связанный класс списка.
public class LinkList<T> {
private int total = 0;
private Node_<T> start;
private Node_<T> end;
private Node_<T> ptr;
public LinkList() {
}
public LinkList(T data) {
start = new Node_<T>(data, 0);
end = start;
ptr = start;
total++;
}
public void add(T data) {
if (start == null) {
start = new Node_<T>(data, 0);
end = start;
ptr = start;
total++;
} else {
end.set((T) data,(int) total);
total++;
end = end.getNext();
}
}
public void displayAt(int index) {
if (start != null) {
ptr = start;
do {
if (ptr.getIndex() == index)
ptr.display();
} while (ptr.hasNext());
}
else
System.out.println("No Element found");
}
public void displayAll() {
if (start != null) {
ptr = start;
do {
ptr.display();
} while (ptr.hasNext());
}
else
System.out.println("No Element Present");
}
}
Следующий код в основном классе
public class Main {
public static void main(String[] args) {
LinkList<Integer> list = new LinkList<Integer>(25);
list.displayAll();
for (int i = 0; i < 11; i++) {
list.add((Integer) i);
}
list.displayAll();
}
}
Я получаю следующую ошибку, и я не могу понять проблему.
25
Exception in thread "main" java.lang.NullPointerException
at LinkList.add(LinkList.java:26)
at Main.main(Main.java:8)
Любое предложение, где я ошибаюсь.
NullPointerException
Метод Node_.set()
оставляет значение end.next
null. Это означает, что после того, как вы столкнулись с циклом после получения исключения NullPointerException.
add(Node_<T>)
метода Похоже, что вместо добавления нового узла в список вы устанавливаете содержимое последнего узла. Я думаю, вы должны построить новый узел, установив end.next
чтобы указать на этот новый узел и, наконец, установить end
как новый узел.
public void add(final T data) {
if (start == null) {
start = new Node_<T>(data, 0);
end = start;
ptr = start;
total++;
} else {
end.setNext(new Node_<T>(data, total));
total++;
end = end.getNext();
}
}
Следует отметить, что вам нужно будет обновить класс Node_, чтобы предоставить сеттер для next
переменной - в настоящий момент он инициализируется null
и не может быть изменен.
displayAll()
И, наконец, как только вы создадите LinkedList, ваша программа displayAll
далее перемещается по списку, если есть несколько элементов, она просто печатает первый элемент навсегда. Вам нужно включить ptr = ptr.getNext()
. Что-то вроде этого работает:
public void displayAll() {
if (start != null) {
ptr = start;
while (ptr != null) {
ptr.display();
ptr = ptr.getNext();
}
} else {
System.out.println("No Element Present");
}
}
Когда экземпляр LinkedList
создается, он создает новый Node
и назначает его для start
, end
и ptr
. Когда новому Node
создается next
, присваивается значение null:
public Node_(T data, int index) {
this.data = data;
this.index = index;
next = null; //assigned null
}
Затем метод add
затем повторяется внутри тела цикла. Во время первой итерации end
присваивается возвращаемое значение getNext
которое равно null. На второй итерации вызывается метод end
вызывающий NullPointerException
.
public void add(T data) {
if (start == null) {
start = new Node_<T>(data, 0);
end = start;
ptr = start;
total++;
} else {
end.set((T) data,(int) total); //end is null on second iteration
total++;
end = end.getNext(); //Set to null on the first iteration
}
}