【问题标题】:Java Retrieve List Payload from a Provided IndexJava 从提供的索引中检索列表有效负载
【发布时间】:2013-04-03 12:59:37
【问题描述】:

我正在创建一个链接列表,并试图弄清楚如何编写一个方法来返回特定索引的节点有效负载。向量如何具有 get(int index) 我想实现类似的东西。此外,有了这个功能,我也可以轻松地拥有一个 add(int index, e Element) ,这对于循环双向链表来说将非常方便。

在我的 DynamicNode 文件中,我是这样实现的:

    public class DynamicNode {
    private Object info;
    private DynamicNode next, previous;
    private int position;

    public DynamicNode(Object x) {
        info = x;
    }

    public Object getInfo() {
        return info;
    }

    public DynamicNode getNext() {
        return next;
    }

    public DynamicNode getPrevious() {
        return previous;
    }

    public int getPosition() {
        return position;
    }

    public void setInfo(Object x) {
        info = x;
    }

    public void setNext(DynamicNode n) {
        next = n;
    }

    public void setPrevious(DynamicNode m) {
        previous = m;
    }

    public void setPosition(int x) {
        position = x;
    }
}

我的 LinkedList.java 文件中有一个计数器,用于递增和递减节点数,以便传递索引。

我认为 get(int index) 语句可行的唯一方法是在 get 方法中运行一个循环来检查节点的索引,当正确的索引匹配时,它会返回与节点,但这似乎是一个非常密集的过程。

在此先感谢您,如果您需要更多信息,请发布,我会尽力填补空白。

我的插入方法

public void insert(DynamicNode node) {
        //set node's previous node to the last node entered
        node.setPrevious(last);

        //set previous node's next to node
        last.setNext(node);

        //set node's next to first node
        node.setNext(first);

        //increase numNodes pool
        numNodes++;

        //sets new last node 
        last = node;

        //sets node position
        node.setPosition(numNodes);
    }

【问题讨论】:

    标签: java data-structures nodes


    【解决方案1】:

    这是链表的主要缺点:对于由数组支持的列表,按索引进行随机访问是 O(n) 而不是 O(1)。它们就是这样工作的。

    您可以通过使用跳过列表使事情变得更好,但它会使事情变得更加复杂,并且需要更多的内存。

    注意,在每个节点中存储索引会使情况更糟,因为在第一个索引处插入一个节点,在没有存储索引的情况下应该是 O(1),但在索引时会变成 O(n),因为你需要访问列表的每个节点来增加它们的索引。通过存储这个索引,你基本上从链表和数组列表中都得到了最糟糕的部分。

    你为什么要实现一个链表,而不是使用标准的java.util.LinkedList

    【讨论】:

    • 首先要回答你的最后一个问题,这是为了上课,我们必须创建自己的 LinkedList 文件。你能多解释一下 O(n) 和 O(1) 吗?您的意思是访问不是在数组中按顺序获取索引,而是基本上遍历整个列表以获取索引?这是有道理的,但我的想法是在插入节点时实现索引。我将使用 insert() 方法编辑我的 OP,因为它太长而无法响应。但这样节点索引与 info、next 和 previous 一起是有效负载的一部分。
    • 在链表的开头插入一个节点应该是一个常数时间操作(O(1))。您只需创建一个新节点,将其下一个指针设置为当前第一个节点,就完成了。由于您将每个节点的位置存储在节点本身中,因此此操作变得更加复杂:您需要另外迭代列表中的所有节点以增加它们的位置。这使它成为 O(n)。通过这样做,您将失去链表相对于数组列表的所有(小)优势。而且我看不到您获得了什么,因为无论如何您都必须遍历节点才能实现 get(i)
    • 啊,我现在完全明白了。这是有道理的,但是当我添加一个节点时,我将它添加到列表的后面,而不是前面,所以在这方面,每次添加节点时它不是增量位置,而是如果我添加一个节点列表的中间。我希望这将是一个简单的(ish)方法,我可以编写它以将节点拉到特定索引处,但如果这样做的方法是遍历节点直到找到 node.index(x),则遍历节点的方法是 node.getNext() 和 count++ 直到我到达它。所以节点索引是浪费时间。谢谢!
    • 所以我返回并更改了我的代码,而不是使用索引,我使用内置计数器的插入(索引),它就像一个魅力,似乎比实现要容易得多一个索引。在中间插入或取出一些东西需要更多的工作,但效果很好!再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2018-11-10
    • 2022-01-07
    相关资源
    最近更新 更多