为什么我的冒泡排序算法会对链表进行排序? 给定一个列表并调用该方法时,它将输出相同的列表。我的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;
}
}
}
答案 0 :(得分:1)
问题是由for循环中的赋值而不是比较引起的。
如果您正在实施链接列表,我建议您使用哨兵而不是头部
和NULL结束。这将删除所有角落案例'在插入和删除期间。
始终存在一个哨兵节点,不包含数据,指向第一个项目,
最后一项指向它。
我还建议使用Mergesort
,它适用于链表,在O(NlogN)中运行,
并且没有空间开销。您可以找到实施here
答案 1 :(得分:0)
尝试通过调试器运行它。如果您在current
循环的第二轮查看changed
的值,您会看到current
仍为null
,因此第二次围绕changed
1}}循环它不会通过current
循环。