多维四方链表



好的。。所以我决定尝试Java中的链表,而不是我用来引用..中指针的常用C++

对于中心节点,遍历可以是上、下、左、右。对于角落中的节点,它们只能移动两个方向,边缘上的节点可以移动三个方向。。所有其他人都可以移动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);
    }
}

因此,当我试图将值设置在矩阵的中间时,它会抛出一个空指针错误。。如果我试图在构造函数中设置它,它运行得很好。。因此,我的节点必须以某种方式进行垃圾清理。。

在行之间的迭代次数与向下迭代列的次数一样多。也就是说,在您的示例中,被访问的实际节点是(9,3(,超出了Matrix的范围。

相反,您应该在行上迭代一次,然后在列下迭代一次。

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

你不只是使用二维数组,有什么特别的原因吗?

相关内容

  • 没有找到相关文章

最新更新