わかりました。そこで、ポインタを参照するために使用される通常のC ++ではなく、Javaでリンクリストを試すことにしました。
トラバーサルは、中央ノードの場合、上、下、左、右になります。コーナーのノードの場合、2方向にしか移動できず、エッジのノードは3方向に移動できます。他のすべてのノードは4方向に移動できます。
問題:
プログラムがコンストラクターを離れると、ノードがなんらかの形で削除されます:S get / setを使用すると、リンクがnullであるため、リンクをトラバースできません。最初のノードを除きます。
私のノードは:
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);
}
}
したがって、マトリックスのほぼ中央に値を設定しようとすると、nullポインターエラーがスローされます。コンストラクターで設定しようとすると、正常に機能します。したがって、ノードはどういうわけかガベージをクリーンアップしている必要があります。