C# 如何对“添加到链表”进行编码,以便可以从最旧的项目打印到最新的项目?

C# 如何对“添加到链表”进行编码,以便可以从最旧的项目打印到最新的项目?,c#,linked-list,console.writeline,C#,Linked List,Console.writeline,好的,我必须按照我的顺序打印一个链表。每个节点都引用一个ticket对象,ticket对象有自己的打印功能,我可以调用它。我可以删除列表的开头,并将其引用到下一张票证,但要对其进行编码,以便将最新到最旧的票证打印出来。我相信问题在于我的代码允许我向列表中添加一张票证: private class TicketNode { //basic node public TicketNode next; public Ticket data;

好的,我必须按照我的顺序打印一个链表。每个节点都引用一个ticket对象,ticket对象有自己的打印功能,我可以调用它。我可以删除列表的开头,并将其引用到下一张票证,但要对其进行编码,以便将最新到最旧的票证打印出来。我相信问题在于我的代码允许我向列表中添加一张票证:

    private class TicketNode 
    { //basic node
        public TicketNode next;
        public Ticket data;

        public TicketNode(Ticket tic)
        {
            data = tic;
        }
    }
    public void PrintAll()
    {//Prints all tickets
        TicketNode cur = first;
        while (cur != null)
        {
            cur.data.PrintDescription();
            cur = cur.next;
        }
    }
    public void AddTicket(Ticket t)
    {
        TicketNode ticNode; //creates a new node

        if (first == null) //for kick-starting the list
            first = new TicketNode(t);
        else
        {
            ticNode = new TicketNode(t); //initializes node
            ticNode.next = first; 
            first = ticNode; //first.next is the ticket that was ticNode
        } 
    }
例:我把票用字符串Low、另一个Low和Final Low输入,当我想打印出来时,我希望:

低 另一个低点 最后低点

相反,我得到: 最后低点 另一个低点 低

如果我要移到最早的低点,我下次打印时会看到类似的内容: 另一个低点 最后低点


关于如何重新调整列表方向的任何想法?

最简单的解决方案是在列表末尾插入新项目。要在O1中实现这一点,需要将指针保持在列表中最后一项的最后一个位置。插入新项时,可以使用该指针快速获取最后一项,追加新项并更新指针


通过这种修改,您可以从first到next进行迭代,并实际按插入顺序获取项目。

在将元素添加到链表中时,您可以找到列表的末尾,然后在那里。下面的代码可能对您有用 AddTicket方法应该是这样的

void AddTicket(Ticket t)
{
    TicketNode ticNode; //creates a new node

    if (first == null) //for kick-starting the list
        first = new TicketNode(t);
    else
    {
        ticNodeNew = new TicketNode(t);
        TicketNode ticNode; = first;
        while(ticNode.next != null)
        {
            ticNode = ticNode.next;
        }

        ticNode.next = ticNodeNew;
    } 
}

}

在链接列表中,一个项目引用下一个最早的项目,以此类推。最近的项目位于列表的第一位,最早的项目位于列表的末尾。这就是为什么在PrintAll中运行列表时,会得到从最年轻到最老的项目

您需要以相反的顺序打印列表,一种简单的方法是使用堆栈

  public void PrintAll()
    {
        var stack = new Stack<TicketNode>();
        TicketNode cur = first;
        while (cur != null)
        {
            stack.Push(cur);
            cur = cur.next;
        }

        while (stack.Count > 0)
            stack.Pop().data.PrintDescription();
    }
MH09的解决方案以从最早到最年轻的顺序存储列表也是有效的。MH09的解决方案遍历AddTicket上的整个列表,我的解决方案遍历PrintAll中的列表。您可能希望根据性能选择更适合您的解决方案。但是,在这两种情况下,遍历都处于打开状态