5

わかりました。そこで、ポインタを参照するために使用される通常の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ポインターエラーがスローされます。コンストラクターで設定しようとすると、正常に機能します。したがって、ノードはどういうわけかガベージをクリーンアップしている必要があります。

4

1 に答える 1

4

列を下に反復するのと同じ回数、行を反復します。つまり、あなたの例では、アクセスされる実際のノードは(9、3)であり、の範囲外ですMatrix

代わりに、行全体を1回繰り返してから、列を1回繰り返す必要があります。

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

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

2次元配列を使用しているだけではない特別な理由はありますか?

于 2013-01-18T02:06:17.057 に答える