0

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

    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”的票,当我想打印出来时,我期望:

低 另一个低 最终低

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

如果我要删除到最旧的(“低”),我应该在下次打印时看到类似这样的内容:Another Low Final Low

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

4

3 回答 3

0

最简单的解决方案是在列表末尾插入新项目。要在 O(1) 中做到这一点,您需要保留指向last列表中最后一项的指针。当您插入一个新项目时,您可以使用该指针快速获取最后一个项目、追加新项目并更新指针。

通过该修改,您可以从firstvia迭代next并实际按插入顺序获取项目。

于 2014-04-26T05:45:08.143 回答
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;
    } 
}

}

于 2014-04-26T05:47:53.577 回答
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)。

于 2014-04-26T06:00:16.300 回答