#java #data-structures #linked-list
#java #структуры данных #связанный список
Вопрос:
Я пытаюсь выполнить итерацию по реализации связанного списка в Java и изменять каждый элемент связанного списка за постоянное время. Я знаю о методе set() связанного списка, но эта операция равна O (n) . Итак, если бы я использовал метод set() в цикле, это было бы O (n ^ 2), чего я не хочу. Поскольку я выполняю итерацию по связанному списку, я уже знаю положение узла, содержимое которого я хочу изменить. Есть ли у меня способ сделать это за постоянное время, используя связанный список Java?
Я делал это много раз с пользовательскими реализациями, но я не вижу способа сделать это за постоянное время. Я попытался выполнить итерацию ниже, но я что-то упускаю.
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
iterator.remove();
iterator.set(); // using set() wouldn't be O(1)
}
Комментарии:
1. @KevinAnderson Я имел в виду вместо этого ввести list.set() . Хотя существует метод set(), использующий итератор списка, о котором я до сих пор не знал.
Ответ №1:
Iterator
не имеет set
метода. К счастью, вы работаете с LinkedList
, и ListIterator
у вас есть set
метод.
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
it.set("new_" it.next());
}
Комментарии:
1. Лучший ответ, используя преимущества LinkedList. Сегодня, похоже, никто больше не знает, что это на самом деле.
2. Будет ли использование метода set() заменять содержимое узла в LinkedList за постоянное время (давайте просто рассмотрим одну итерацию)? Я бы хотел иметь возможность изменять содержимое каждого узла в связанном списке за постоянное время, используя цикл (таким образом, сложность времени O (n) в целом).).
3. Да, в этом весь смысл a
ListIterator
: он имеет дело напрямую (т. Е. За O (1) время) с узлами списка,