我的代码有问题,我已经创建了一个单独链接的列表类,您可以在其中添加,删除,修改,合并等...但是,我正在尝试一个简单的冒泡排序并遇到了问题,其中列表未正确排序。这里有一些注意事项:
public static void sortList()
{
if (isEmpty() == true)
{
System.out.println("Cannot sort - the list is empty");
}
else if (getHead().getNext() == null)
{
System.out.println("List sorted");
}
else
{
Node current = getHead().getNext();
CustomerFile tempDat;
boolean swapDone = true;
while (swapDone)
{
current = getHead().getNext();
swapDone = false;
while (current != null)
{
if (current.getNext() != null &&
current.getData().getSurname().compareTo(
current.getNext().getData().getSurname()) >0)
{
tempDat = current.getData();
current.setData(current.getNext().getData());
current.getNext().setData(tempDat);
swapDone = true;
}
current = current.getNext();
}
}
if (getHead().getData().getSurname().compareTo(
getHead().getNext().getData().getSurname()) >0)
{
current = getHead().getNext();
getHead().setNext(current.getNext());
setHead(current);
}
}
}
我很感激反馈
答案 0 :(得分:4)
你的代码是一个奇怪的混合物,主要是交换数据,但通过切换链接来特别试图将它与下一个交换。
正如另一个答案所指出的那样,最后一次交换没有正确实现,但是如果你通过交换数据来做事情,那么没有理由特别对待头部。
您所要做的就是在外循环的头部开始每次遍历列表。
这产生了一个可行的解决方案:
public void sortList()
{
if (isEmpty())
{
System.out.println("An empty list is already sorted");
}
else if (getHead().getNext() == null)
{
System.out.println("A one-element list is already sorted");
}
else
{
Node current = getHead();
boolean swapDone = true;
while (swapDone)
{
swapDone = false;
while (current != null)
{
if (current.getNext() != null && current.getData().getSurname().compareTo(current.getNext().getData().getSurname()) >0)
{
CustomerFile tempDat = current.getData();
current.setData(current.getNext().getData());
current.getNext().setData(tempDat);
swapDone = true;
}
current = current.getNext();
}
current = getHead();
}
}
}
我已经将这个非静态化,因为正如评论中所指出的那样,我不清楚你们如何能够像静态一样工作。您可以在上下文中将其设置为静态。
我还改变了其他一些小事。无需通过
等代码检查条件if (isEmpty() == true)
在Java中,这完全等同于
if (isEmpty())
并且tempDat
不需要在使用它之外声明。
答案 1 :(得分:1)
您的排序不包括头部。
public static void sortList()
{
if (isEmpty() == true)
{
System.out.println("Cannot sort - the list is empty");
}
else if (getHead().getNext() == null)
{
System.out.println("List sorted");
}
else
{
Node current = getHead();
// Node current = getHead().getNext();
CustomerFile tempDat;
boolean swapDone = true;
while (swapDone)
{
current = getHead().getNext();
swapDone = false;
while (current != null)
{
if (current.getNext() != null && current.getData().getSurname().compareTo(current.getNext().getData().getSurname()) >0)
{
tempDat = current.getData(); // td -> objectA, cd -> objectA
current.setData(current.getNext().getData()); // cd -> objectB
current.getNext().setData(tempDat); // nd -> td -> objectA
swapDone = true;
}
current = current.getNext();
}
}
//if (getHead().getData().getSurname().compareTo(getHead().getNext().getData().getSurname()) >0)
//{
// current = getHead().getNext(); // current -> head+1
// getHead().setNext(current.getNext()); //head+1 -> head+2
// setHead(current); // head -> head+1
//}
}
}
上面注释掉的代码中也有错误。应用该代码会丢弃一个节点。
// list: a -> b -> c -> d
current = getHead().getNext(); // current = b
getHead().setNext(current.getNext()); // a -> c
setHead(current); // head = b
// list: b -> c -> d
// and nothing points to 'a' anymore
而不是交换数据,你应该尝试交换节点。如果你采用这种方法,你应该找到一个更好的解决方案。
答案 2 :(得分:1)
我认为这里的主要问题是你从
开始current = getHead().getNext()
使用此代码,您将完全退出排序过程,可能是这里的数据需要转到列表的另一端,但在这种情况下,它将始终是数据在head元素中,或者是头节点之后的数据(后者是由于你的if语句结尾)。
尝试从列表的头部开始,看看它会带来什么。