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