C# 在C中添加排序链表#

C# 在C中添加排序链表#,c#,generics,linked-list,sortedlist,C#,Generics,Linked List,Sortedlist,我有这样一个类来实现C#中的排序链表。现在它实际上并没有被排序,但是我必须对这个方法做什么改变呢 class LinkedSortedList<T> { public Node<T> Head { get; set; } public Node<T> Tail { get; set; } public int Count { get; set; } public LinkedSorted

我有这样一个类来实现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;
        }
类链接分类列表
{
公共节点头{get;set;}
公共节点尾部{get;set;}
公共整数计数{get;set;}
公共链接分类列表()
{
Head=null;
Tail=null;
计数=0;
}
公共链接分类列表(T数据)
{
创建列表(数据);
}
公共无效补遗(T数据)
{            
if(Tail!=null)
{
var节点=新节点(数据);
Tail.Next=节点;
尾=节点;
计数++;
}
其他的
{
创建列表(数据);
}
}
公共无效创建列表(T数据)
{
var节点=新节点(数据);
头部=节点;
尾=节点;
计数=1;
}

我想修改AddElement函数,使列表保持排序。如何实现此逻辑?

完成任务需要注意的一点是,在
AddElement
的开头,列表要么是空的,要么是已排序的。如果列表是空的,则任务很简单;如果列表已排序,则必须执行p单击要添加的元素的插入点,然后将新元素插入其中。插入后列表将保持排序,因为不需要移动其他元素


要查找插入点,请从列表头开始遍历列表,直到(1)找到大于所插入元素的元素,或(2)您到达了列表的末尾。在这两种情况下,您只需在遍历过程中传递的最后一个元素之后立即插入新元素,或者如果初始元素大于您要插入的元素,则在开头插入新元素。

当前,您只需将元素添加到列表的末尾。相反,我们希望遍历列表并查看t每个值,直到找到插入节点的正确位置

执行此操作的一种方法是执行以下检查:

  • 头是否为空?如果是,请使用此数据创建一个新列表,我们就完成了
  • 新节点的数据是否小于头部数据?如果是,请将此节点放在头部前面,并将头部指向我们的新节点
  • 新节点的数据是否大于尾部数据?如果是,请将此节点放在尾部之后,并将尾部指向我们的新节点
  • 否则,创建一个指向头部的“当前”节点,将当前节点的数据与新节点进行比较,并通过将“当前”设置为其下一个属性继续在列表中移动,直到找到插入新节点的正确位置。然后重新排列三个节点的下一个和上一个属性(新节点、它前面的节点和它后面的节点)
  • 例如:

    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++;
            }
        }
    }
    
    public void AddElement(T数据)
    {            
    if(Head==null)
    {
    创建列表(数据);
    }
    其他的
    {
    var节点=新节点(数据);
    if(node.DataTail.Data)
    {
    Tail.Next=节点;
    node.Previous=Tail;
    尾=节点;
    }
    其他的
    {
    无功电流=水头;
    while(node.Data>=current.Data&¤t.Next!=null)
    {
    当前=当前。下一步;
    }
    node.Previous=当前.Previous;
    如果(node.Previous!=null)node.Previous.Next=node;
    当前.Previous=节点;
    node.Next=当前;
    如果(Head==当前)Head=节点;
    计数++;
    }
    }
    }
    
    您需要迭代当前元素,根据排序顺序找到放置新元素的正确位置。最重要的是,您需要一种“排序”方法元素,因此您可以根据任意一对来决定哪个元素更大或更小。@Alejandro我想说您需要一种比较元素的方法。根据底层容器的不同,二进制搜索可能会加快速度。@JHBonarius OP正在制作一个链表,所以很遗憾二进制搜索无法工作。