![](/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.