我正在使用C#,我想在不使用额外内存的情况下对链表进行排序。
Input: listptr→ 11 → 8 → 2→ 4 → 5
Output: listptr→ 2 → 4 → 5 → 8 → 11
这是我的班级:
public class SNode
{
public int data;
public SNode next;
}
我应该创建一个新的temp
变量来存储临时列表吗?
赞SNode temp = new SNode(2,NULL);
?
这是一项家庭作业。
答案 0 :(得分:2)
嗯,一个简单的方法就是打破链条,在List<>中对其进行排序然后重新链接对象。
这是我对此的看法。我知道我完全失败了“没有额外的记忆”。部分。遗憾。
public class SNode : IComparable
{
public int data;
public SNode next;
// Implement IComparable, so List.Sort can do its magic.
public int CompareTo(object obj)
{
SNode node = obj as SNode;
if (node == null)
throw (new Exception()); // Wrong type?
if (this.data < node.data)
return -1;
else if (this.data > node.data)
return 1;
else
return 0;
}
}
// Sort the linked nodes.
public SNode Sort(SNode root)
{
List<SNode> list = Unlink(root);
list.Sort();
return Link(list);
}
// Unlink a chained link and return a list of them.
public List<SNode> Unlink(SNode root)
{
List<SNode> nodes = new List<SNode>();
nodes.Add(root);
nodes.AddRange(Unlink(root.next));
root.next = null;
return nodes;
}
// Take a list and build a linked list.
public SNode Link(List<SNode> list)
{
if (list.Count == 0)
return null;
for(int i = 0; i < list.Count - 1; i++)
list[i].next = list[i + 1];
return list[0];
}
答案 1 :(得分:0)
一种简单(不是最有效)的方法是创建一个与列表大小相同的数组,并让数组中的每个元素引用一个节点。然后使用内置排序方法对数组进行排序。作为最后一步,您遍历数组并将每个节点的链接设置为正确的后继者。
由于这个问题是作业,我怀疑你不允许使用内置的排序方法。如果是这样,您必须为链表实现任何现有的排序算法。 Merge sort似乎是一个很好的候选人。 Here是对单链表上算法的一个很好的描述。
答案 2 :(得分:0)
我认为练习的重点是对列表进行排序而不创建整个事物的副本(所以你可以使用变量形式的少量内存来帮助排序)。 / p>
编码它的最简单方法可能是使用bubble sort(尽管这对于大型列表来说效率非常低)。诀窍是使用变量来跟踪当前对之前的节点,因为如果需要交换对中节点的顺序,则必须调整其next
。
正如其他人所指出的那样,在一个真实的项目中你会使用.NET框架为你做繁重的工作,但我想这是指针操作的理论练习所以你是我应该为你自己编码。