所以我要做的是对链表进行排序。我坚持打破它似乎永远不会逃脱的循环。从示例中我发现我所要做的就是检查下一个值是否为空,那么我做错了什么?
另外,由于我无法弄清楚为什么这不会制动出循环,这段代码是否应该正确地进行链表排序?
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);
}
答案 0 :(得分:1)
嗯,砰的一声,你的最后3行有一个逻辑问题:
Link newLink = new Link(iTempData, dTempData);
newLink.next = first;
first = newLink;
在这里,您设置newLink.next = first。因此它不是空的。接下来设置first = newLink。所以你可以很快看到first.next永远不会为null。
从循环中我可以看出,你实际上并没有在列表中移动节点, 但只有节点内的数据。在这种情况下,您只需要移动数据:
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;
}