LinkedListNode<T>类可获得列表中的上一个元素和下一个元素。属性有List、Next、Previous、Value
List:返回与节点相关的LinkedList对象
Next和Previous:用于遍历列表,访问当前节点之后和之前的节点
Value:返回与节点相关的元素,类型为T
LinkedList<T>类可访问链表中的第一个或最后一个元素(First和Last),指定位置插入元素(AddAfter()、AddBefore()、AddFirst()、AddLast9()),链表中搜索元素(Find()和FindLast())
using System;
using System.Collections.Generic;
using System.Text;
namespace 链表
{
public class Document
{
public string Title { get; }
public string Content { get; }
public byte Priority { get; }
public Document (string title,string content,byte priority)
{
Title = title;
Content = content;
Priority = priority;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace 链表
{
public class PriorityDocumentManager
{
private readonly LinkedList<Document> _documentlist;//包含所有文档
private readonly List<LinkedListNode<Document>> _priorityNodes;//添加指定优先级的新文档的入口点
public PriorityDocumentManager()
{
_documentlist = new LinkedList<Document>();
_priorityNodes = new List<LinkedListNode<Document>>(10);
for (int i = 0; i < 10; i++)
{
_priorityNodes.Add(new LinkedListNode<Document>(null)); //用null来初始化
}
}
public void AddDocument(Document d)
{
if (d == null) throw new ArgumentNullException(nameof(d));
AddDocumentToPriorityNode(d, d.Priority);
}
/// <summary>
/// 文档先按优先级排序,再按添加文档的时间排序
/// </summary>
/// <param name="doc"></param>
/// <param name="priority"></param>
private void AddDocumentToPriorityNode(Document doc, int priority)
{
//检查优先级是否在允许的优先级的范围内
if (priority > 9 || priority < 0)
{
throw new ArgumentException("Priority must be between 0 and 9");
}
if (_priorityNodes[priority].Value == null)
{
--priority;
//检查下一个较低的优先级
if (priority >= 0)
{
AddDocumentToPriorityNode(doc, priority);
}
else
{
//现在不存在具有相同优先级或更低优先级的优先级节点
_documentlist.AddLast(doc);
_priorityNodes[doc.Priority] = _documentlist.Last;
}
return;
}
else//存在一个优先级节点
{
LinkedListNode<Document> prioNode = _priorityNodes[priority];
if (priority == doc.Priority)//具有相同优先级的优先级节点存在
{
_documentlist.AddAfter(prioNode, doc);
//将优先级节点设置为最后一个具有相同优先级的文档
_priorityNodes[doc.Priority] = prioNode.Next;
}
else//只存在优先级较低的优先级节点
{
//获取优先级较低的第一个节点
LinkedListNode<Document> firstPrioNode = prioNode;
while (firstPrioNode .Previous !=null &&firstPrioNode.Previous.Value.Priority == prioNode.Value.Priority)
{
firstPrioNode = prioNode.Previous;
prioNode = firstPrioNode;
}
_documentlist.AddBefore(firstPrioNode, doc);
//将优先级节点设置为新值
_priorityNodes[doc.Priority] = firstPrioNode.Previous;
}
}
}
public void DisplayAllNodes()
{
foreach (Document doc in _documentlist)
{
Console.WriteLine($"priority:{doc.Priority },title {doc.Title }");
}
}
//返回具有最高优先级的文档
//它是链表中的第一个
public Document GetDocument()
{
Document doc = _documentlist.First.Value;
_documentlist.RemoveFirst();
return doc;
}
}
}
using System;
namespace 链表
{
class Program
{
static void Main(string[] args)
{
var pdm = new PriorityDocumentManager();
pdm.AddDocument(new Document("one", "Sample", 1));
pdm.AddDocument(new Document("two", "Sample", 3));
pdm.AddDocument(new Document("three", "Sample", 4));
pdm.AddDocument(new Document("four", "Sample", 3));
pdm.AddDocument(new Document("five", "Sample", 2));
//pdm.AddDocument(new Document("six", "Sample", 4));
pdm.DisplayAllNodes();
}
}
}