考虑一个简单的结构:
struct Node{
int val;
Node *next;
Node *freeNode;
};
现在我必须仅使用 freeNode 对给定的链表进行排序,并且该方法必须高效。我不能制作另一个列表并在那里使用某种排序插入。也不能使用基因组或冒泡排序。列表中任何元素的指针freeNode
可以指向列表中的任何元素。
现在我想出了两个想法:
使用 freeNode 创建一个双向链表。
并进行配对比较,即将第 i 个元素与第 (i+1) 个元素进行比较。当我发现需要交换两个元素时,我交换它们,然后再次从列表的头部开始。
该算法将超过 O(n)(不确定只是猜测)。这将需要很多时间。
另一种方法是我的 freeNode 指向比它小的 elem。
例如,如果我有
30->6->14->56>Tail
,那么56->freeNode->14 30->freeNode->14 14->freeNode->6 6->freeNode->NULL.
但同样,这并没有多大帮助,因为当我插入时,
45 or 20
我必须重新安排我的freeNode
指针。而且,这也不是一个非常有效的方法。
对此有何建议?如何使用freeNode
来实现更好更高效的排序方法。伪代码可以工作,我实际上更喜欢它而不是真正的代码。
编辑:您不能使用数组、向量或其他任何东西。只是freeNode
指针。以任何你想要的方式使用它。保持它为 NULL 或让它指向您选择的元素。