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