【问题标题】:Sort a single linked list without allocating new node instances [closed]在不分配新节点实例的情况下对单个链表进行排序[关闭]
【发布时间】:2026-01-06 01:20:07
【问题描述】:

我正在使用 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);

这是家庭作业。

【问题讨论】:

  • 为什么不用内置的LinkedList<T>类?
  • 有什么问题?如何排序?如何分配内存?为什么要分配内存并且在问题中说要在不使用额外内存的情况下进行排序?
  • temp 只是保存你的 SNode 的地址。
  • 在 C# 中(unsafe 代码除外),没有指针的概念。请记住,structprimitive types 变量是值,而 class 变量只是引用。
  • 这是一个家庭作业问题 - 不知道是谁删除了标签。

标签: c# data-structures linked-list


【解决方案1】:

嗯,一种简单的方法是断开链,将其排序到 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];
}

【讨论】:

    【解决方案2】:

    我认为练习的重点是在不创建整个内容的副本的情况下对列表进行适当的排序(因此您可能可以使用变量形式的少量内存来帮助排序)。

    最简单的编码方法可能是使用bubble sort(尽管这对于大型列表来说效率极低)。诀窍是使用变量来跟踪当前对之前的节点,因为如果您需要交换对中节点的顺序,则必须调整其next

    正如其他人所指出的,在实际项目中,您将使用 .NET 框架为您完成繁重的工作,但我想这是 指针 操作的理论练习,所以您应该自己编写代码。

    【讨论】:

      【解决方案3】:

      一种简单(不是最有效)的方法是创建一个与列表大小相同的数组,并让数组中的每个元素引用一个节点。然后使用内置的排序方法对数组进行排序。作为最后一步,您循环遍历数组并将每个节点的链接设置为正确的后继节点。

      由于这个问题是家庭作业,我怀疑您不允许使用内置的排序方法。如果是这样,您必须为您的链表实现任何现有的排序算法。 Merge sort 似乎是个不错的候选人。 Here 很好地描述了单链表上的算法。

      【讨论】:

        最近更新 更多