簡體   English   中英

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)]

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

  2. 創建一個迭代器並將其前進3

  3. 使用迭代器添加E2

  4. 將同一個迭代器前進2 ( 5 - 3 )。

  5. 添加E1

  6. ...

請注意,此算法有一個一對一的錯誤。 修復它應該相對容易。

更新:剛剛注意到您的問題要簡單得多。 在您的情況下,只需創建一個迭代器,將其前進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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM