![](/img/trans.png)
[英]How to maintain an Ordered Linked List and add, remove elements in java
[英]Java: How to add (somewhere in the middle) multiple elements in a linked list?
将元素添加到链表已知是 O(1)。
但是,将它添加到位置 X 是 O(X),如果我想在此位置添加 R 元素,则总运行时间将为 O(R*X)。
但必须有一个 O(X+R) 解决方案。
问题是如何在 Java 中执行 O(R+X)?
您有一个对(element, X)
列表,其中X
是一个索引, element
是您要放在该索引下的项目。 按X
对这个列表进行排序,并使用Iterator
一个接一个地添加元素。 这是一个例子:
您的输入是: [(E1, 5), (E2, 3), (E3, 7)]
。
按索引排序: [(E2, 3), (E1, 5), (E3, 7)]
创建一个迭代器并将其前进3
。
使用迭代器添加E2
。
将同一个迭代器前进2
( 5 - 3
)。
添加E1
。
...
请注意,此算法有一个一对一的错误。 修复它应该相对容易。
更新:刚刚注意到您的问题要简单得多。 在您的情况下,只需创建一个迭代器,将其前进X
次并使用该迭代器一个一个地添加元素。
假设您使用的是java.util.LinkedList ,则存在返回 ListIterator 的LinkedList.listIterator () 方法:
公共 ListIterator listIterator(int index)
返回此列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。 [...]
列表迭代器是快速失败的:如果列表在创建迭代器后的任何时候在结构上被修改,除了通过列表迭代器自己的删除或添加方法之外,列表迭代器将抛出一个 ConcurrentModificationException。 [...]
并且您可以使用ListIterator.add () 安全地在 LinkedList 的中间添加一个项目:
无效添加(E e)
将指定元素插入列表(可选操作)。 [...]
例如,假设你想将 list2 放在 list1 的第 5 个位置,你可以通过执行以下操作来实现:
LinkedList list1 = ...;
LinkedList list2 = ...;
ListIterator it1 = list1.listIterator(5);
for (Object item : list2) {
it1.add(item);
}
将元素放入集合中,然后您可以使用addAll方法将它们全部添加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.