我正在尝试为我的链接列表实现冒泡排序。我使用的是我在本网站上找到的算法并制作了相应的方法。但是,我得到了错误:
线程中的异常" main"显示java.lang.NullPointerException
在Node.compareTo
在LinkedList.bubbleSort 在LinkedList.main
我不确定如何解决这个问题。任何帮助将不胜感激。
public class LinkedList {
Node first;
public void add(char c, int index) {
if(index==0) {
if(first==null) first = new Node();
else add(first, first.datum, 1);
first.datum = c;
}
else add(first, c, index);
}
public void add(Node n, char c, int index) {
if(index==1) {
Node newnode = new Node();
newnode.datum = c;
newnode.link = n.link;
n.link = newnode;
}
else add(n.link, c, index-1);
}
public void swap(int i1, int i2) {
char temp = get(i1).datum;
get(i1).datum = get(i2).datum;
get(i2).datum = temp;
}
public void print() {
System.out.println(first);
}
public Node get(int index) {
return get(index, first);
}
public Node get(int index, Node n) {
if(index==0) return n;
return get(index-1, n.link);
}
public void set(int index, char c) {
get(index).datum = c;
}
public int length()
{
int counter = 0;
Node temp = first;
while(temp!=null) {
temp = temp.link;
counter++;
}
return counter;
}
public void bubbleSort()
{
for (int i = 0; i < length(); i++)
{
for (int j = i; j < length(); j++)
{
if (get(j).compareTo(get(j+1)) > 0)
{
swap(j, j + 1);
}
}
}
}
public static void syso(String s) {
System.out.println(s);
}
public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.add('c', 0);
ll.add('m', 1);
ll.add('a', 2);
ll.add('x', 3);
ll.add('d', 2);
ll.print();
Node n1 = ll.get(1);
Node n2 = ll.get(2);
if(n1.compareTo(n2)>0) syso("bigger");
else if(n1.compareTo(n2)==0) syso("equal");
else syso("smaller");
ll.bubbleSort();
ll.print();
}
} //end class LinkedList
class Node {
char datum;
Node link = null;
public String toString() {
return datum + ":" + link;
}
int compareTo(Node n) {
return datum - n.datum;
}
}
答案 0 :(得分:2)
你的问题就在这里。
get(j).compareTo(get(j+1))
当j
是列表中最后一个东西的索引时,这会使您与null进行比较,从而抛出异常。
在循环中,您需要比较j < length()
,而不是比较j < length() - 1
,这样就可以避免j
是列表中的最后一件事。
答案 1 :(得分:0)
您正在执行
get(j).compareTo(get(j+1))
其中j可以达到length - 1.因此,当j等于length -1时,它会尝试获取该元素的长度,并且get()在这种情况下返回null。 (顺便说一句,它应该抛出一个异常来表示错误)。