2013-01-18 69 views
4

好吧..所以我決定嘗試在Java中鏈表,而不是我已經習慣了引用的指針在平時的C++ ..多維四方向鏈表

遍歷可以向上,向下,左,右爲一箇中心節點。對於在彎道中的節點,他們只移動兩個方向節點上的邊緣可以移動3個方向。所有其他可移動4.

問題:

當我的程序離開的構造,我的節點被不小心刪除:S當我使用get/set時,它不能遍歷鏈接,因爲它們是空的。除了第一個節點。

我的節點是:

package linkedlist; 

public class Node { 
    public Node Up, Down, Left, Right; 
    public int Value; 

    public Node() { 
     Value = -1; 
     Up = Down = Left = Right = null; 
    } 
} 

我做執行,如:

package linkedlist; 

public class Matrix { 
    private int Width, Height; 
    private Node Reference; 

    public Matrix(int Width, int Height) { 
     Reference = new Node(); 
     this.Width = Width; this.Height = Height; 
     Node RowIterator = Reference, ColumnIterator = Reference; 

     for (int I = 0; I < Height; ++I) { 
      for (int J = 0; J < Width; ++J) { 
       if (I == 0) { 
        if (J < Width - 1) { 
         RowIterator.Right = new Node(); 
         RowIterator.Right.Left = RowIterator; 
         RowIterator = RowIterator.Right; 
        } 
       } 
       else { 
        if (I < Height - 1) { 
         ColumnIterator.Down = new Node(); 
        } 

        RowIterator = ColumnIterator; 
        RowIterator.Right = new Node(); 
        RowIterator.Up = ColumnIterator; 
        RowIterator.Up.Down = RowIterator; 
        RowIterator.Right.Left = RowIterator; 
        RowIterator.Right.Up = RowIterator.Up.Right; 
        RowIterator = RowIterator.Right; 

        ColumnIterator = ColumnIterator.Down; 
       } 
      } 
     } 
    } 

    public void SetValue(int I, int J, int Value) { 
      //Same as get except it sets rather than returns.. 
    } 

    public int GetValue(int I, int J) { 
     RowIterator = ColumnIterator = Reference; 
     for (int K = 0; K < J; ++K) { 
      for (int L = 0; L < I; ++L) { 
       RowIterator = RowIterator.Right; 
      } 

      ColumnIterator = ColumnIterator.Down; 
      RowIterator = ColumnIterator; 
     } 

     return RowIterator.Value; 
    } 
} 

和主像:

package linkedlist; 

public class LinkedList { 
    public static void main(String[] args) { 
     Matrix M = new Matrix(6, 6); 

     M.SetValue(3, 3, 10); 
    } 
} 

所以,當我試圖設置在靠近中間值的矩陣,它會拋出一個空指針錯誤..如果我試圖在構造函數中設置它,它工作得很好..因此,我的節點必須是索姆ehow越來越垃圾清理..

回答

3

您遍歷該行多次迭代沿着列。也就是說,在你的例子中,訪問的實際節點是(9,3),超出了你的Matrix的範圍。

相反,您應該在整個行上迭代一次,然後在列的下一次迭代。

for (int K = 0; K < J; ++K) { 
    Iterator = Iterator.Down; 
} 

for (int L = 0; L < I; ++L) { 
    Iterator = Iterator.Right; 
} 

你是不是隻使用一個2維數組的任何特別的原因?

+0

我不明白..矩陣是6 x 6其中有36個元素。 我迭代3 x 3這應該是中心? :S 你的例子是有道理的,但我看不出爲什麼我錯了。 我沒有使用二維數組,因爲我的老師決定挑戰我,並要求我使用節點/鏈接列表只有.. – Brandon

+1

@CantChooseUsernames在你的解決方案中,你會右鍵3個元素,然後下降1,然後右3個元素,然後下降1,然後右3個元素,然後下降1. –

+0

Omg ..我明白了!阿哈哈謝謝你打開我的眼睛。我會接受你的回答。 – Brandon