C# 如何对“添加到链表”进行编码,以便可以从最旧的项目打印到最新的项目?
好的,我必须按照我的顺序打印一个链表。每个节点都引用一个ticket对象,ticket对象有自己的打印功能,我可以调用它。我可以删除列表的开头,并将其引用到下一张票证,但要对其进行编码,以便将最新到最旧的票证打印出来。我相信问题在于我的代码允许我向列表中添加一张票证:C# 如何对“添加到链表”进行编码,以便可以从最旧的项目打印到最新的项目?,c#,linked-list,console.writeline,C#,Linked List,Console.writeline,好的,我必须按照我的顺序打印一个链表。每个节点都引用一个ticket对象,ticket对象有自己的打印功能,我可以调用它。我可以删除列表的开头,并将其引用到下一张票证,但要对其进行编码,以便将最新到最旧的票证打印出来。我相信问题在于我的代码允许我向列表中添加一张票证: private class TicketNode { //basic node public TicketNode next; public Ticket data;
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中的列表。您可能希望根据性能选择更适合您的解决方案。但是,在这两种情况下,遍历都处于打开状态