,所以我要做的是对链接列表进行排序。我陷入了突破循环中,似乎永远不会逃脱。从示例中,我发现我要做的就是检查下一个值是否为null,所以我做错了什么?
另外,由于我不知道为什么这不会从循环中刹车,因此该代码似乎应该正确地排序链接列表?
public void sortFirst() {
do
{
if (first.iData >= first.next.iData)
{
int iTempData = first.iData;
double dTempData = first.dData;
first.iData = first.next.iData;
first.dData = first.next.dData;
Link newLink = new Link(iTempData, dTempData);
newLink.next = first;
first = newLink;
}
}
while (first.next != null);
}
好吧,在蝙蝠上,您在最后3行中有一个逻辑问题:
Link newLink = new Link(iTempData, dTempData);
newLink.next = first;
first = newLink;
在这里,您将NewLink.Next =首先设置。因此,它不是零。接下来,您将首先设置= newlink。因此,您可以快速看到第一。
根据我在您的循环中可以告诉的,您实际上并没有在列表中转移节点,但是只有节点内的数据。在这种情况下,您只需要移动数据:
int iTempData = first.iData;
double dTempData = first.dData;
first.iData = first.next.iData;
first.dData = first.next.dData;
first.next.iData = iTempData;
first.next.dData = dTempData;
(并删除创建新节点并在列表中错误插入的最后3行)。当然,这有点丑陋。链接列表的很酷的事情是,您可以简单地将列表中的节点移动,因此您将执行以下操作:
current = head;
prev = null;
while( current != null && current.next != null ){
next = current.next;
if( current.iData > next.iData ) {
// need to swap nodes
if( prev == null ) {
// special head case
head = next;
current.next = head.next;
head.next = current;
}
else
{
prev.next = next;
current.next = next.next;
next.next = current;
}
}
// increment pointer
prev = current;
current = current.next;
}