为什么我的气泡排序算法不会对链表进行排序?当给定一个列表并调用该方法时,它将输出相同的列表。我的 for 循环中的当前逻辑有什么问题?
private:
IntNode *head, *tail;
节点结构:
struct IntNode
{
int data;
IntNode * next;
};
气泡排序方法:
void NodeSLList::SortList()
{
if (head == NULL || head->next == NULL)
return;
IntNode * current = head;
IntNode * nextElement = current->next;
IntNode * temp = NULL;
int changed = 1;
while (changed)
{
changed = 0;
for (current; (current != NULL) && (nextElement = NULL); )
{
if (current->data > nextElement->data)
{
temp = current->next;
current->next = nextElement->next;
nextElement->next = temp;
changed = 1;
}
current = current->next;
nextElement = nextElement->next;
}
}
}
该问题是由在 for 循环中分配而不是比较引起的。
如果您正在实现链表,我可以建议使用哨兵而不是头部
和 NULL 作为结尾。这将在插入和移除过程中消除所有"角落情况"。
哨兵节点始终存在,不包含任何数据,指向第一项,
最后一项指向它。
我也可以建议使用 Mergesort
,它适用于链表,在 O(NlogN) 中运行,
并且没有头顶空间。您可以在此处找到实现
尝试通过调试器运行它。如果你在第二次绕changed
循环时查看current
的值,你会发现current
仍然是null
,所以第二次绕changed
循环时它不会通过current
循环。