2014-04-26 33 views
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 
     } 
    } 

恩:我把在串票「低」,「另一種低」,以及「最終低」和當我要打印出來我想到:

低 另一個低 最終低

相反,我得到: 最終低 另一個低 低

如果我要刪除到最老的(「低」),我應該看到類似下次打印: 另一個低 最終低

有關如何重新定位列表的任何想法?

回答

0

最簡單的解決方案是將新項目插入列表的末尾。要在O(1)中做到這一點,你需要保持一個指針last到列表中的最後一個項目。當您插入一個新項目時,您可以使用該指針快速獲取最後一個項目,追加新項目並更新指針。

通過該修改,您可以從first經由next進行迭代,並實際獲取插入順序中的項目。

0

將元素添加到鏈接列表中時,您已經找到列表的末尾。下面的代碼可能對您有用 AddTicket方法是sholud是這樣

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; 
    } 
} 

}

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

相關問題