如何将代码添加到链表中,以便从最旧项打印到最新项



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

    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"one_answers"Final Low"字符串的票放进去,当我想打印出来时,我希望:

低另一个低点最终低

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

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

关于如何调整列表的方向,有什么想法吗?

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

通过该修改,您可以从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()中浏览列表时,你会得到从最年轻到最年长的项目。

你需要以相反的顺序打印你的列表,一个简单的方法是使用Stack。

  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)。

相关内容

  • 没有找到相关文章

最新更新