← Назад к вопросам

Как можно обратиться на следующий элемент в 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²).

Лучший выбор для обращения к следующему элементу:

  1. ListIterator — полный контроль и двунаправленность
  2. for-each + индексная переменная — простота и понятность
  3. Iterator — универсальность