在不分配新节点实例的情况下对单个链表进行排序

时间:2012-10-21 07:06:56

标签: c# data-structures linked-list

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

这是一项家庭作业。

3 个答案:

答案 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框架为你做繁重的工作,但我想这是指针操作的理论练习所以你是我应该为你自己编码。

相关问题