如何编码添加到链表,以便您可以打印从最旧到最新的项目?

时间:2014-04-26 05:21:08

标签: c# linked-list console.writeline

好的,所以我必须从我输入的订单中打印出一个链表。每个节点都引用一个票对象,票对象有自己的打印功能,我可以调用它。我可以删除列表的开头并将其引用到下一张票,但是将其编码以便打印出最新到最旧的票。我相信问题在于我的代码允许我在列表中添加票证:

    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"," Another Low"和" Final Low"当我想要打印出来时,我希望:

低 另一个低点 最后的低点

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

如果我要删除到最旧的(" Low")我应该在下次打印时看到这样的内容: 另一个低点 最后的低点

关于如何重新定位列表的任何想法?

3 个答案:

答案 0 :(得分:0)

最简单的解决方案是在列表末尾插入新项目。要在O(1)中执行此操作,您需要将指针last保留到列表中的最后一项。插入新项目时,使用该指针快速获取最后一项,附加新项目并更新指针。

通过该修改,您可以从first通过next进行迭代,并实际获取其插入顺序中的项目。

答案 1 :(得分:0)

将元素添加到链接列表中时,您可以找到列表的末尾。以下代码可能对您有用 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;
    } 
}

}

答案 2 :(得分:0)

在您的链接列表中,一个项目引用下一个最旧的项目等。最近的项目是列表中的第一项,最旧的项目位于列表的末尾。这就是为什么当您浏览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()中的列表。您可能希望根据性能选择哪种解决方案更适合您。但是在这两种情况下,遍历都是O(n)。