【问题标题】:Java: How to add (somewhere in the middle) multiple elements in a linked list?Java:如何在链表中添加(中间某处)多个元素?
【发布时间】:2012-07-21 00:23:32
【问题描述】:

将元素添加到链表已知是 O(1)。

但是,将它添加到位置 X 是 O(X) 如果我想在这个位置添加 R 元素,总运行时间将是 O(R*X)。

但必须有 O(X+R) 解。

问题是如何在java中做O(R+X)?

【问题讨论】:

    标签: java linked-list insertion


    【解决方案1】:

    您有一个(element, X) 对列表,其中X 是一个索引,element 是您要放在该索引下的项目。按X 对该列表进行排序,并使用Iterator 一个接一个地添加元素。这是一个例子:

    您的输入是:[(E1, 5), (E2, 3), (E3, 7)]

    1. 按索引排序:[(E2, 3), (E1, 5), (E3, 7)]

    2. 创建一个迭代器并将其推进3

    3. 使用迭代器添加E2

    4. 将同一迭代器推进2 (5 - 3)。

    5. 添加E1

    6. ...

    请注意,此算法有一个由一错误。修复它应该相对容易。

    更新:刚刚注意到您的问题要简单得多。在您的情况下,只需创建一个迭代器,将其推进X 次,然后使用该迭代器一个一个地添加元素。

    【讨论】:

    • 这是一个稍微不同的问题
    • @Lie 确实如此,但这是对所问问题的概括,所以..在我的书中很好。显而易见的简化可以留给我希望的读者作为练习。
    • 据我所知(如果底层集合被修改,迭代器的行为是未指定的)实际上这个解决方案是第一个想到的..但它似乎在java中不起作用
    • @AhmadIbrahem:有趣,你能指出一些文档/JavaDoc 吗?我猜LinkedList 对 OP 来说已经足够了。
    • 如果集合被修改不是通过迭代器本身,则迭代器的行为未指定 - 建议使用ListIterator.add
    【解决方案2】:

    假设您使用的是java.util.LinkedList,则有一个返回 ListIterator 的LinkedList.listIterator() 方法:

    public ListIterator listIterator(int index)

    返回此列表中元素的列表迭代器(在适当的 序列),从列表中的指定位置开始。 [...]

    列表迭代器是快速失败的:如果列表在结构上被修改 在迭代器创建后的任何时间,以任何方式,除了通过 列表迭代器自己的删除或添加方法,列表迭代器将 抛出 ConcurrentModificationException。 [...]

    您可以使用ListIterator.add() 在LinkedList 的中间安全地添加一个项目:

    void add(E e)

    将指定元素插入到列表中(可选操作)。 [...]

    例如,假设您要将 list2 放在 list1 的第 5 位,您可以这样做:

    LinkedList list1 = ...;
    LinkedList list2 = ...;
    
    ListIterator it1 = list1.listIterator(5);
    for (Object item : list2) {
        it1.add(item);
    }
    

    【讨论】:

      【解决方案3】:

      将元素放入集合中,然后您可以使用addAll 方法将它们全部添加。

      【讨论】:

      • 我其实很喜欢这个答案 :)
      • 我也喜欢它,但根据合理的评论(已删除),这个解决方案显然不正确。我暂时删除了答案,并试图找出直接使用 ListIterator.add 和通过 addAll 方法使用它的主要区别是什么。我找不到它 - 所以我取消删除了这个答案,也许有人告诉我,我会得到启发。
      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      相关资源
      最近更新 更多