链表的冒泡排序实现

时间:2014-01-28 22:41:17

标签: java linked-list bubble-sort

我正在尝试为我的链接列表实现冒泡排序。我使用的是我在本网站上找到的算法并制作了相应的方法。但是,我得到了错误:

  

线程中的异常" 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;
    }
}

2 个答案:

答案 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。 (顺便说一句,它应该抛出一个异常来表示错误)。