好的,所以我必须从我输入的订单中打印出一个链表。每个节点都引用一个票对象,票对象有自己的打印功能,我可以调用它。我可以删除列表的开头并将其引用到下一张票,但是将其编码以便打印出最新到最旧的票。我相信问题在于我的代码允许我在列表中添加票证:
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")我应该在下次打印时看到这样的内容: 另一个低点 最后的低点
关于如何重新定位列表的任何想法?
答案 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)。