2014-01-14 173 views
0

我想實現簡單的鏈表和添加項目及其看來我Add功能進入死循環,我不知道爲什麼添加節點到鏈表

public class IntNode 
{ 
    private int _value; 
    private IntNode _next; 
    public IntNode(int val, IntNode n) 
    { 
     _value = val; 
     _next = n; 
    } 
    public int getValue() 
    { 
     return _value; 
    } 
    public IntNode getNext() 
    { 
     return _next; 
    } 
    public void setValue(int v) 
    { 
     _value = v; 
    } 
    public void setNext(IntNode next) 
    { 
     _next = next; 
    } 

    public string ToString() 
    { 
     return _value.ToString(); 
    } 
} 

    public class IntList 
    { 
     private IntNode _head; 
     public static int count; 

     public IntList() 
     { 
      _head = null; 
      count = 0; 
     } 
     public IntList(IntNode node) 
     { 
      _head = node; 
     } 

     public void Add(IntNode node) 
     { 
      if (_head == null) 
       _head = node; 
      else 
      { 
       for (IntNode p = _head; p.getNext() != null; p.getNext()) { } 
       _head.setNext(node); 
       count++; 
      } 
     } 

     public void ToString() 
     { 
      IntNode cur = _head; 
      while (cur.getNext() != null) 
      { 
       Console.WriteLine(cur.ToString()); 
       cur = cur.getNext(); 
      } 
     } 
    } 

主要

static void Main(string[] args) 
    { 
     IntList list = new IntList(); 
     list.Add(new IntNode(5, null)); 
     list.Add(new IntNode(2, null)); 
     list.Add(new IntNode(8, null)); 
     list.Add(new IntNode(1, null)); 

     list.ToString(); 

    } 
+0

爲什麼不保留對尾部的引用? – zerkms

+1

在'for'循環中是否指'p = p.getNext()'? –

+0

是的,爲什麼?...... – user2908206

回答

2

問題是for循環中的增量步驟。它需要是p = p.getNext()而不僅僅是p.getNext()。後者只是調用getNext功能,不做任何處理,這意味着p絕不會被修改,因此,循環就不會取得任何進展

for (IntNode p = _head; p.getNext() != null; p = p.getNext()) { } 

下一個問題是你是不是真正的移動_head或使用p返回值。因此,你實際上並沒有找到可以插入的地方。你需要的是像下面

IntNode p = _head; 
while (p.getNext() != null) { 
    p = p.getNext(); 
} 
p.setNext(node); 
+0

@zerkms不,編譯器必須假定'getNext'具有需要發生的副作用,因此它不會將其刪除 – JaredPar

+0

@zerkms這是無關緊要的。代碼在第一個地方顯然是錯誤的。 –

+0

@Ondrej Tucny:確實無關緊要,我只是對編譯器行爲感到好奇 – zerkms

1
for (IntNode p = _head; p.getNext() != null; p.getNext()) { } 

您沒有使用p的任何地方,而不是做在循環體中任何東西。你能發現你的問題嗎?

0

首先,你沒有任何地方分配的getNext()結果:

for (IntNode p = _head; p.getNext() != null; p.getNext()) { } 

其次,你甚至不會在任何地方使用的最後一個節點。事實上,你甚至不能,因爲p不會在for循環外存在......

忠告:保持到最後節點的參考以及使您的生活更簡單。

0

您的循環永不結束,因爲p不會增加。

如果您保留對上次插入項目的引用,應該會更容易些。例如:

private IntNode _lastNode; 

public void Add(IntNode node) 
{ 
    if (_head == null) 
     _head = node; 
    else 
    { 
     if (_lastNode == null) 
      _lastNode = _head; 

     _lastNode.setNext(node) 
     _lastNode = node; 
    } 
    count++; 
} 

每次嘗試添加節點時都不必循環訪問節點。

+0

只是爲了方便:通常將它命名爲「tail」 – zerkms