【问题标题】:Multi-Dimensional Quad-Directional Linked List多维四向链表
【发布时间】:2013-01-18 01:57:27
【问题描述】:

好的.. 所以我决定尝试使用 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);
    }
}

所以当我尝试将值设置在矩阵的中间附近时,它会引发空指针错误。如果我尝试在构造函数中设置它,它工作得很好。因此我的节点一定会以某种方式得到垃圾清理干净..

【问题讨论】:

    标签: java reference linked-list


    【解决方案1】:

    遍历行的次数与向下遍历列的次数一样多。即,在您的示例中,实际访问的节点是 (9, 3),超出了您的 Matrix 的范围。

    相反,您应该遍历行一次,然后向下遍历列一次。

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

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

    【讨论】:

    • 我不明白.. 矩阵是 6 x 6 有 36 个元素.. 我迭代 3 x 3 应该是中心? :S 你的例子是有道理的,但我不明白为什么我的错了。我没有使用二维数组,因为我的老师决定挑战我并要求我只使用节点/链接列表制作一个矩阵..
    • @CantChooseUsernames 在您的解决方案中,您将向右移动 3 个元素,然后向下移动 1,然后向右移动 3 个元素,然后向下移动 1,然后向右移动 3 个元素,然后向下移动 1。
    • 天啊.. 我明白了!啊哈哈谢谢你让我大开眼界。我会接受你的回答。
    猜你喜欢
    • 2021-08-06
    • 2022-12-10
    • 2015-09-05
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多