簡體   English   中英

在 C# 中添加排序鏈表

[英]Adding in Sorted Linked List in C#

我有這樣一個 class 用於在 C# 中實現排序鏈表。 現在它實際上並沒有排序,但是我必須對這種方法進行哪些更改才能使其成為一個?

class LinkedSortedList<T>
    {
        public Node<T> Head { get; set; }
        public Node<T> Tail { get; set; }
        public int Count { get; set; }

        public LinkedSortedList()
        {
            Head = null;
            Tail = null;
            Count = 0;
        }

        public LinkedSortedList(T data)
        {
            CreateList(data);
        }

        public void AddElement(T data)
        {            
            if (Tail != null)
            {
                var node = new Node<T>(data);
                Tail.Next = node;
                Tail = node;
                Count++;
            }

            else
            {
                CreateList(data);
            }
        }

        public void CreateList(T data)
        {
            var node = new Node<T>(data);
            Head = node;
            Tail = node;
            Count = 1;
        }

我想修改 AddElement function 以便列表保持排序。 我該如何實現這個邏輯?

為了完成任務,您需要進行的一個關鍵觀察是,在AddElement的開頭,列表要么是空的,要么是已排序的。 如果列表為空,則您的任務微不足道; 如果列表已排序,則必須為要添加的元素選擇一個插入點,並將新元素插入那里。 插入后列表將保持排序,因為不需要移動其他元素。

要找到插入點,請從頭部開始遍歷列表,直到 (1) 找到一個大於所插入元素的元素,或者 (2) 到達列表末尾。 在這兩種情況下,您只需在遍歷期間通過的最后一個元素之后立即插入新元素,或者如果初始元素大於您要插入的元素,則在頭部插入新元素。

目前,您只是將元素添加到列表的末尾。 相反,我們想遍歷列表並查看每個值,直到找到插入節點的正確位置。

一種方法是進行以下檢查:

  1. 頭是null嗎? 如果是這樣,請使用此數據創建一個新列表,我們就完成了。
  2. 新節點的數據是否小於 Head 數據? 如果是這樣,將這個節點放在 Head 前面,並將 Head 指向我們的新節點。
  3. 新節點的數據是否大於 Tail 數據? 如果是這樣,請將這個節點放在 Tail 之后,並將 Tail 指向我們的新節點。
  4. 否則,創建一個指向頭部的“當前”節點,將當前節點的數據與我們的新節點進行比較,並通過將“當前”設置為它的 Next 屬性繼續在列表中移動,直到找到合適的插入位置新節點。 然后重新排列三個節點(新節點、之前的節點和之后的節點)的 Next 和 Previous 屬性。

例如:

public void AddElement(T data)
{            
    if (Head == null)
    {
       CreateList(data);
    }
    else
    {
        var node = new Node<T>(data);

        if (node.Data < Head.Data)
        {
            Head.Previous = node;
            node.Next = Head;
            Head = node;
        }
        else if (node.Data > Tail.Data)
        {
            Tail.Next = node;
            node.Previous = Tail;
            Tail = node;
        }
        else
        {
            var current = Head;
   
            while(node.Data >= current.Data && current.Next != null)
            {
                current = current.Next;
            }

           node.Previous = current.Previous;
           if (node.Previous != null) node.Previous.Next = node;
           current.Previous = node;
           node.Next = current;
           if (Head == current) Head = node;
           Count++;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM