Java 链表冒泡排序的实现

Java 链表冒泡排序的实现,java,linked-list,bubble-sort,Java,Linked List,Bubble Sort,我正在尝试为我的链表实现一个冒泡排序。我正在使用我在这个网站上找到的算法,并制定了适当的方法。但是,我得到了以下错误: 线程“main”java.lang.NullPointerException中出现异常 在Node.compareTo 在LinkedList.bubbleSort 在LinkedList.main 我不知道如何解决这个问题。任何帮助都将不胜感激 public class LinkedList {

我正在尝试为我的链表实现一个冒泡排序。我正在使用我在这个网站上找到的算法,并制定了适当的方法。但是,我得到了以下错误:

线程“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;
    }
}
公共类链接列表{                                                                                                                                                                                                                                                                                                                                                                      
节点优先;
公共空添加(字符c,整数索引){
如果(索引==0){
如果(first==null)first=new Node();
否则添加(第一,第一。基准,1);
第一,基准=c;
}
否则添加(第一,c,索引);
}
公共void添加(节点n、字符c、整数索引){
如果(索引==1){
Node newnode=新节点();
newnode.datum=c;
newnode.link=n.link;
n、 link=newnode;
}
否则添加(n.link,c,索引-1);
}
公共无效掉期(int i1、int i2){
字符温度=获取(i1)数据;
get(i1).datum=get(i2).datum;
获取(i2)。基准=温度;
}
公开作废印刷品(){
System.out.println(第一);
}
公共节点get(int索引){
返回get(索引,第一);
}
公共节点get(int索引,节点n){
如果(索引==0)返回n;
返回get(索引-1,n.link);
}
公共无效集(整数索引,字符c){
获取(索引)。数据=c;
}
公共整数长度()
{   
int计数器=0;
节点温度=第一;
while(temp!=null){
温度=温度链接;
计数器++;
}
返回计数器;
}
public void bubbleSort()
{   
对于(int i=0;i0比较
{   
互换(j,j+1);
}
}
}
}
公共静态void syso(字符串s){
系统输出打印项次;
}
公共静态void main(字符串[]args){
LinkedList ll=新建LinkedList();
ll.加上('c',0);
ll.加上('m',1);
ll.加上('a',2);
ll.加上('x',3);
ll.添加('d',2);
ll.print();
节点n1=ll.get(1);
节点n2=ll.get(2);
如果(n1.与(n2)>0)syso(“更大”);
如果(n1.与(n2)==0)syso(“相等”);
else syso(“较小”);
ll.bubbleSort();
ll.print();
}
}//结束类LinkedList
类节点{
字符数据;
节点链接=空;
公共字符串toString(){
返回数据+“:”+链接;
}
int compareTo(节点n){
返回基准-n.基准;
}
}
您的问题就在这里

get(j).compareTo(get(j+1))
j
是列表中最后一项的索引时,这会使您与null进行比较,这会引发异常

在循环中,您需要比较
j
,而不是比较
j
,这样就避免了
j
是列表中最后一项的情况。

get(j).compareTo(get(j+1))

其中,j可以增加到长度-1。因此,当j等于长度-1时,它尝试获取长度为的元素,在这种情况下,get()返回null。(顺便说一下,它应该抛出一个异常来表示错误)。

请检查。该节点指向
null
if(get(j).compareTo(get(j+1))>0
冒着
j+1
从列表末尾消失的风险。谢谢,我在发布后不久就看到了。唯一的问题是我的最终链接列表是“c:a:d:m:x:null”。第一个“c”似乎不受排序的影响。是的,您的算法是错误的。如果您不交换节点0和节点1,那么您就永远不会再查看节点0。这种比较应该以某种方式涉及
i
,而不仅仅是
j
j+1