我是仿制药的新手,我正在尝试制作链表。
这是Node_ class的代码。
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");
}
}
Main class中的以下代码
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)
任何建议我哪里出错。
答案 0 :(得分:3)
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
变量的setter - 此时它已初始化为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");
}
}
答案 1 :(得分:0)
实例化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
}
}