[英]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) 到達列表末尾。 在這兩種情況下,您只需在遍歷期間通過的最后一個元素之后立即插入新元素,或者如果初始元素大於您要插入的元素,則在頭部插入新元素。
目前,您只是將元素添加到列表的末尾。 相反,我們想遍歷列表並查看每個值,直到找到插入節點的正確位置。
一種方法是進行以下檢查:
例如:
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.