2014-05-02 61 views
0

我試圖創建,增加了一個int現有的鏈接列表的末尾的方法。鏈表滾動

問:收件採用一個列表中,這不是一個 前哨淋巴結的頭部,和一個int,n的方法。該方法應該將第一個節點移動到列表的末尾,同時保持它們的順序不變。例如,如果您有一個列表[1, 3, 5, 7, 9]n = 3,則您的 方法應返回列表:[7, 9, 1, 3, 5](返回 的修改列表的頭部)。

這裏是我的問題是關於addlast僅方法:

public class ListItem{ 
    public int value; 
    public ListItem next; 

    public ListItem(int value, ListItem next){ 
     this.value = value; 
     this.next = next; 
    } 

    public void addFirst(int x){ 
     head = new ListItem(x, head); 
     size++ 
    } 

    public void addLast(int x){ 
     if(head == null){ 
      addFirst(x); 
     } 
     else{ 
      ListItem p; 
      for(p = head; p != null; p = p.next){ 
       p.next = new ListItem(x, null); 
       size++; 
      } 
     }   
} 

我對如何通過列表的方法迭代有點困惑。在for循環中,它從頭開始,滾動直到沒有p.next。但是裏面的方法看起來像是用新的列表項替換每個p.next,而不是滾動直到結束。代碼的哪部分解釋瞭如何在不添加現有列表中每個地方的新項目的情況下跳過?

+0

你在哪裏定義'head'元素? –

+0

我相信addFirst方法?除非我搞砸了,並且在該方法中定義不會使其向下延伸 –

回答

1

假設你定義headsize屬性;

對於addLast功能else部分應該如下。

for(p = head; p.next != null; p = p.next); 
p.next = new ListItem(x, null); 
size++; 
+0

(注意'for ...;'。我發現它更注意使用'for ... {}'或更好;'ListItem p = head; while(p.next!= null){p = p.next;}') –

+0

@JoopEggen是的,你是對的。我只是試着對現有的代碼做最小的改動。 –

+0

有人可以解釋我在底部的問題嗎?代碼的哪一部分表示它滾動直到結束,而不是用int x替換每個p.next?它看起來像for循環從頭開始,直到p.next爲空,並在每個實例中用int x替換p。 –