【问题标题】:Merge sort in generic single linked list通用单链表中的合并排序
【发布时间】:2016-02-14 17:49:26
【问题描述】:

在排序时遇到一些麻烦,在调试时,我发现有趣的事情是在方法 Merge 中返回的数据是正确的,然后它加入 MergeSortLL 方法并显示 Head 那里只有一个节点,而 ex 必须有。 5 排序节点。我在这里能错过什么?

public static LinkedListNode<T> MergeSortLL<T>(LinkedListNode<T> Head) where T : IComparable<T>
{           
    if (Head == null || Head.Next == null)
        return Head;

    LinkedListNode<T> middle = GetMiddle(Head);
    LinkedListNode<T> half = middle.Next;
    middle.Next = null;

    return Merge(MergeSortLL(Head), MergeSortLL(half));
}

            public static LinkedListNode<T> Merge<T>(LinkedListNode<T> Left, LinkedListNode<T> Right) where T : IComparable<T>
            {

                var mHead = new LinkedListNode<T>(default(T));
                LinkedListNode<T> curr = mHead;

                while (Left != null && Right != null)
                {
                    if (Left.Value.CompareTo(Right.Value) <= 0)
                    {
                        curr.Next = Left;
                        Left = Left.Next;
                    }
                    else
                    {
                        curr.Next = Right;
                        Right = Right.Next;
                    }
                    curr = curr.Next;
                }
                curr.Next = (Left == null) ? Right : Left;

                return mHead.Next;
            }

            public static LinkedListNode<T> GetMiddle<T>(LinkedListNode<T> Head) where T : IComparable<T>
            {
                if (Head == null)
                {
                    return Head;
                }

                LinkedListNode<T> slow, fast;
                slow = fast = Head;

                while (fast.Next != null && fast.Next.Next != null)
                {
                    slow = slow.Next;
                    fast = fast.Next.Next;
                }
                return slow;
            }

【问题讨论】:

    标签: c# generics linked-list mergesort


    【解决方案1】:

    我会在这里错过什么?

    您错过了该方法修改了链接并返回 new 头,因此旧头显示较少或零下一个元素是正常的。

    如果你替换它会更明显

    return Merge(MergeSortLL(Head), MergeSortLL(half));
    

    Head = Merge(MergeSortLL(Head), MergeSortLL(half));
    return Head;
    

    也不要忘记在外部调用中做同样的事情,例如

    LinkedListNode<int> head = ...;
    head = MergeSortLL(head); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2017-08-23
      • 2020-05-24
      • 2023-03-25
      • 2020-09-25
      相关资源
      最近更新 更多