← Назад к вопросам
Как можно обратиться на следующий элемент в LinkedList?
1.0 Junior🔥 141 комментариев
#Коллекции
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Обращение к следующему элементу в LinkedList
1. Использование Iterator
Универсальный способ итерации по LinkedList:
import java.util.LinkedList;
import java.util.Iterator;
public class LinkedListIterator {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Iterator
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String current = iterator.next(); // Текущий элемент
System.out.println("Current: " + current);
}
}
}
2. ListIterator (двунаправленная итерация)
Для итерации в обоих направлениях и доступа к следующему:
import java.util.LinkedList;
import java.util.ListIterator;
public class LinkedListListIterator {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
int currentIndex = iterator.nextIndex(); // Индекс следующего элемента
String current = iterator.next(); // Текущий (следующий) элемент
String nextElement = null;
if (iterator.hasNext()) {
int nextIndex = iterator.nextIndex();
nextElement = list.get(nextIndex); // Следующий элемент
}
System.out.println("Current: " + current + ", Next: " + nextElement);
}
}
}
3. Прямое обращение по индексу
import java.util.LinkedList;
public class LinkedListIndexAccess {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Обращение по индексу
for (int i = 0; i < list.size() - 1; i++) {
String current = list.get(i); // Текущий элемент
String next = list.get(i + 1); // Следующий элемент
System.out.println("Current: " + current + ", Next: " + next);
}
}
}
4. Enhanced for loop (for-each)
import java.util.LinkedList;
public class LinkedListEnhancedFor {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Внутренне использует Iterator
for (String element : list) {
System.out.println("Element: " + element);
}
}
}
5. Stream API (Java 8+)
import java.util.LinkedList;
public class LinkedListStream {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Stream для итерации
list.stream()
.forEach(System.out::println);
// С индексом (используя IntStream)
IntStream.range(0, list.size())
.forEach(i -> {
String current = list.get(i);
String next = (i + 1 < list.size()) ? list.get(i + 1) : null;
System.out.println("Index " + i + ": " + current + " -> " + next);
});
}
}
6. Методы LinkedList специально для доступа
import java.util.LinkedList;
public class LinkedListMethods {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Специальные методы LinkedList
String first = list.getFirst(); // Первый элемент
String last = list.getLast(); // Последний элемент
// Итерация с доступом к следующему
for (int i = 0; i < list.size() - 1; i++) {
String current = list.get(i);
String next = list.get(i + 1);
System.out.println(current + " -> " + next);
}
}
}
7. Практический пример: Обход с доступом к следующему
import java.util.LinkedList;
import java.util.ListIterator;
public class LinkedListPeek {
// Безопасный доступ к следующему элементу
public static <T> void printWithNext(LinkedList<T> list) {
ListIterator<T> iterator = list.listIterator();
while (iterator.hasNext()) {
T current = iterator.next();
T next = null;
// Проверяем, есть ли ещё элементы
if (iterator.hasNext()) {
int nextIndex = iterator.nextIndex();
next = list.get(nextIndex);
}
System.out.println("Current: " + current + ", Next: " + next);
}
}
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
printWithNext(numbers);
}
}
Сравнение подходов
| Способ | Удобство | Производительность | Использование |
|---|---|---|---|
| Iterator | Высокое | Оптимально | Стандартная итерация |
| ListIterator | Высокое | Оптимально | Двунаправленная итерация |
| get(index) | Среднее | НИЗКО для LinkedList | Не рекомендуется |
| for-each | Высокое | Оптимально | Простая итерация |
| Stream API | Высокое | Оптимально | Функциональный стиль |
⚠️ Важное замечание
НЕ используй get(i) для больших LinkedList!
// ❌ ПЛОХО - O(n) для каждого вызова
for (int i = 0; i < list.size(); i++) {
String element = list.get(i); // Медленно на больших списках
}
// ✅ ХОРОШО - O(n) один раз
for (String element : list) {
// Используем Iterator внутри
}
Причина: LinkedList — это список на основе связанных узлов. Доступ по индексу требует обхода от начала до нужной позиции.
Рекомендация
Используй Iterator или for-each для LinkedList — это обеспечит O(n) сложность, а не O(n²).
Лучший выбор для обращения к следующему элементу:
- ListIterator — полный контроль и двунаправленность
- for-each + индексная переменная — простота и понятность
- Iterator — универсальность