English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы рассмотрим LinkedList класс через множество примеров.
Класс LinkedList в Java Collection Framework предоставляет функции структуры списка.
Класс LinkedList в Java предоставляет реализацию двунаправленной链ки.
Каждый элемент списка называетсяузел. Она содержит 3 поля:
Prev - Хранят адрес предыдущего элемента в списке. Первый элемент null.
Next - Хранят адрес следующего элемента в списке. Последний элемент null.
Data - Хранят фактические данные.
Элементы списка не хранятся по порядку. Напротив, они рассеяны и связаны между собой через ссылки (Prev и Next).
Здесь список ссылок содержит 3 элемента.
Dog - Первый элемент принимает null в качестве предыдущего адреса и адрес Cat в качестве следующего адреса
Cat - Второй элемент принимает адрес Dog в качестве предыдущего адреса и адрес Cow в качестве следующего адреса
Cow - Последний элемент принимает адрес Cat в качестве предыдущего адреса и null в качестве следующего элемента
Вот как мы создаем список ссылок с помощью Java:
LinkedList<Type> linkedList = new LinkedList<>();
Здесь Type represents the type of the linked list. Например,
// Создание списка целых чисел // Создание списка целых чисел // Создание списка строк LinkedList<String> linkedList = new LinkedList<>();
Давайте рассмотрим пример.
List<String> animals1 = new LinkedList<>();
Здесь мы используем интерфейс List для объявления списка animals1, который может обращаться только к методам интерфейса List.
Давайте рассмотрим еще один пример.
Queue<String> animals2 = new LinkedList<>(); Deque<String> animals3 = new LinkedList<>();
Здесь animal2 может обращаться к методам интерфейса Queue.
Однако animal3 может обращаться только к методам интерфейсов Deque и Queue. Это связано с тем, что Deque является подинтерфейсом Queue.
LinkedList предоставляет различные методы, которые позволяют выполнять различные операции с списком.
1. Добавление элементов:Использование метода add()
Чтобы добавить элемент (узел) в конец списка, мы используем метод add(). Например,
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> animals = new LinkedList<>(); // Добавление элементов в LinkedList animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Cat, Horse]
2. Добавление элементов: использование индексного номера
Мы также можем использовать индекс для добавления элементов в список. Например,
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> animals = new LinkedList<>(); // Добавление элементов с использованием индекса animals.add(0, "Собака"); animals.add(1, "Кот"); animals.add(2, "Конь"); System.out.println("LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Cat, Horse]
3. Добавление элементов: добавление одного списка в другой
Чтобы добавить все элементы одного списка в другой, мы используем метод addAll(). Например,
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> mammals = new LinkedList<>(); mammals.add("Собака"); mammals.add("Кот"); mammals.add("Конь"); System.out.println("Млекопитающие: " + mammals); LinkedList<String> animals = new LinkedList<>(); animals.add("Крокодил"); // Добавить все элементы mammals в animals animals.addAll(mammals); System.out.println("Животные: " + animals); {} {}
Результат вывода
Млекопитающие: [Собака, Кот, Лошадь] Животные: [Крокодил, Собака, Кот, Лошадь]
4. Добавление элементов: использование метода listIterator()
Мы также можем использовать метод listsIterator() для добавления элементов в список. Для использования его нам нужно импортировать пакет java.util.ListIterator. Например,
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); //Создание объекта ListIterator ListIterator<String> listIterate = animals.listIterator(); listIterate.add("Собака"); listIterate.add("Кот"); System.out.println("LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Собака, Кот]
1. Доступ к элементам: использование метода get()
Чтобы получить элемент из списка, мы можем использовать метод get(). Например,
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); // Получение элемента из списка String str = animals.get(1); System.out.print("Элемент на индексе 1: " + str); {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Элемент на индексе 1: Лошадь
2. Доступ к элементам: использование метода iterator()
Чтобы итерировать элементы списка, мы можем использовать метод iterator(). Для использования этого метода нам нужно импортировать пакет java.util.Iterator. Например,
import java.util.LinkedList; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); // Создание объекта Iterator Iterator<String> iterate = animals.iterator(); System.out.print("LinkedList: \n"); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); {} {} {}
Результат вывода
LinkedList: Собака, Кот, Лошадь,
Здесь:
hasNext() - возвращает true, если существует следующий элемент
next() - возвращает следующий элемент
3. Доступ к элементам: использование метода listIterator()
Мы также можем использовать метод listIterator() для итерации элементов связанных списков. Для использования этого метода нам нужно импортировать пакет java.util.ListIterator.
Метод listsIterator() лучше всего подходит для использования с链表ами. Это связано с тем, что объект listIterator() также может итерироваться назад. Например
import java.util.LinkedList; import java.util.ListIterator; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); //Создание объекта ListIterator ListIterator<String> listIterate = animals.listIterator(); System.out.print("LinkedList: \n"); while(listIterate.hasNext()) { System.out.print(listIterate.next()); System.out.print(", "); {} // Пробег назад System.out.print("\nОбратная LinkedList: \n"); while(listIterate.hasPrevious()) { System.out.print(listIterate.previous()); System.out.print(", "); {} {} {}
Результат вывода
LinkedList: Собака, лошадь, кошка Обратный LinkedList: кошка, лошадь, Собака
Здесь:
hasNext() - возвращает true, если существует следующий элемент
next() - возвращает следующий элемент
hasPrevious() - возвращает true, если существует предыдущий элемент
previous() - возвращает предыдущий элемент
1. Поиск элемента: использование метода contains()
Чтобы проверить, содержит ли список определенный элемент, мы используем метод contains(). Например:
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); //Проверка наличия Собаки в списке if(animals.contains("Собака")) { System.out.println("Собака в LinkedList."); {} {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Собака в LinkedList.
2. Поиск элемента: использование метода indexOf()
indexOf() - возвращает индекс первого的出现 элемента
lastIndexOf() - возвращает индекс последнего的出现 элемента
Например,
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элементов в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: " + animals); //Первое的出现 Собаки int index1 = animals.indexOf("Собака"); System.out.println("Индекс первого的出现 Собаки: " + index1); //Последнее的出现 Собаки int index2 = animals.lastIndexOf("Собака"); System.out.println("Индекс последнего的出现 Собаки: " + index2); {} {}
Результат вывода
LinkedList: [Собака, лошадь, кошка, Собака] Индекс первого的出现 Собаки: 0 Индекс последнего的出现 Собаки: 3
Внимание:Если指定的 элемент не найден, indexOf() и lastIndexOf() возвращают -1.
1. Изменение элемента: использование метода set()
Чтобы изменить элемент в связном списке, мы можем использовать метод set(). Например:
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: " + animals); //Изменение элемента по индексу 3 animals.set(3, "Зебра"); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Собака, лошадь, кошка, Собака] Новый LinkedList: [Собака, лошадь, кошка, зебра]
2. Изменение элементов: использование метода listIterator()
Мы можем также использовать метод listIterator() для изменения элементов в связном списке. Например,
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); //Добавление элементов в список animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: " + animals); //Создание объекта ListIterator ListIterator<String> listIterate = animals.listIterator(); listIterate.next(); //Изменение элемента, возвращенного next() listIterate.set("Cow"); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Cat, Horse] Новый LinkedList: [Cow, Cat, Horse]
1. Удаление элементов: использование метода remove()
Чтобы удалить элемент из связного списка, мы можем использовать метод remove(). Например,
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Zebra"); System.out.println("LinkedList: " + animals); //Удаление элемента с индексом 1 String str = animals.remove(1); System.out.println("Удаление элемента: " + str); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Horse, Cat, Zebra] Удаление элемента: Horse Новый LinkedList: [Dog, Cat, Zebra]
2. Удаление элементов: использование метода listIterator()
Мы можем также использовать метод listsIterator() для удаления элементов из связного списка. Например,
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: " + animals); //Создание объекта ListIterator ListIterator<String> listIterate = animals.listIterator(); listIterate.next(); //Удаление элемента, возвращенного next() listIterate.remove(); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Cat, Horse] Новый LinkedList: [Cat, Horse]
3. Удаление элементов: использование метода clear()
Чтобы удалить все элементы из связного списка, мы используем метод clear(). Например,
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: " + animals); //Удаление всех элементов animals.clear(); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Cat, Horse] Новый LinkedList: []
Внимание:Мы можем также использовать метод removeAll() для удаления всех элементов. Однако, метод clear() более эффективен.
4. Удаление элементов: использование метода removeIf()
Если элемент удовлетворяет определенным условиям, мы также можем удалить их из списка. Для этого мы используем метод removeIf(). Например:
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<Integer> animals = new LinkedList<>(); //Добавление элемента в список animals.add(2); animals.add(3); animals.add(4); animals.add(5); System.out.println("LinkedList: " + animals); // удалять все элементы, которые меньше 4 animals.removeIf((Integer i)->i < 4); System.out.println("Новый LinkedList: " + animals); /** Здесь мы используем lambda выражение * теперь запомните * параметр removeIf() - это условие */ {} {}
Результат вывода
LinkedList: [2, 3, 4, 5] новый LinkedList: [4, 5]
Внимание: (Integer i)->i<4 является lambda выражение. Чтобы узнать больше о lambda выражение, пожалуйста, посетитеJava Lambda выражение
Поскольку класс LinkedList также реализует интерфейсы Queue и Deque, он может также реализовывать методы этих интерфейсов. Вот несколько常用ных методов:
addFirst() - добавляет указанный элемент в начало связного списка
addLast() - добавляет указанный элемент в конец связного списка
Например,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args){ Deque<String> animals = new LinkedList<>(); // добавление элемента в начало LinkedList animals.addFirst("Cow"); animals.addFirst("Dog"); animals.addFirst("Cat"); System.out.println("LinkedList: " + animals); //Добавление элемента в конец LinkedList animals.addLast("Zebra"); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Cat, Dog, Cow] новый LinkedList: [Cat, Dog, Cow, Zebra]
getFirst() - возвращает первый элемент
getLast() - возвращает последний элемент
Например,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args) { Deque<String> animals = new LinkedList<>(); //Добавление элементов в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); // из списка��取 первый элемент String str1 = animals.getFirst(); System.out.println("Первый элемент: " + str1); //Получает последний элемент из списка String str2 = animals.getLast(); System.out.println("Последний элемент: " + str2); {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Первый элемент: Собака Последний элемент: Кот
removeFirst() - удаляет первый элемент
removeLast() - удаляет последний элемент
Например,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args) { Deque<String> animals = new LinkedList<>(); //Добавление элементов в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); //Удаляет первый элемент из LinkedList String str1 = animals.removeFirst(); System.out.println("Удаленный элемент: " + str1); //Удаляет последний элемент из LinkedList String str2 = animals.removeLast(); System.out.println("Удаленный элемент: " + str2); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Удаленный элемент: Собака Удаленный элемент: Кот Новая LinkedList: [Конь]
Метод peek() возвращает первый элемент списка (голова). Например,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); //Доступ к первому элементу LinkedList String str = animals.peek(); System.out.println("Элемент доступа: " + str); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Элемент доступа: Собака Новый LinkedList: [Dog, Horse, Cat]
Метод poll() возвращает и удаляет первый элемент из списка. Например,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: " + animals); //Возвращает и удаляет первый элемент String str = animals.poll(); System.out.println("Удаленный элемент: " + str); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Собака, Конь, Кот] Удаленный элемент: Собака Новая LinkedList: [Конь, Кот]
Метод offer() добавляет указанный элемент в конец связного списка. Например,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals = new LinkedList<>(); //Добавление элемента в список animals.add("Dog"); animals.add("Horse"); System.out.println("LinkedList: " + animals); //Добавление элемента в конец LinkedList animals.offer("Cat"); System.out.println("Новый LinkedList: " + animals); {} {}
Результат вывода
LinkedList: [Dog, Horse] Новый LinkedList: [Dog, Horse, Cat]
1. Использование цикла forEach для遍ения
import java.util.LinkedList; class Main { public static void main(String[] args) { //Создание списка LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: " + animals); //Использование цикла forEach System.out.println("Доступ к элементам списка:"); for(String animal: animals) { System.out.print(animal); System.out.print(", "); {} {} {}
Результат вывода
LinkedList: [Коровы, Кошки, Собаки] Доступ к элементам списка: Коровы, Кошки, Собаки
2. Использование цикла for
import java.util.LinkedList; class Main { public static void main(String[] args) { //Создание списка LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: " + animals); //Использование цикла for System.out.println("Доступ к элементам списка:"); for(int i = 0; i < animals.size(); i++) { System.out.print(animals.get(i)); System.out.print(", "); {} {} {}
Результат вывода
LinkedList: [Коровы, Кошки, Собаки] Доступ к элементам списка: Коровы, Кошки, Собаки
В обоих примерах мы используем цикл для доступа к каждому элементу списка.
3. Использование метода iterator()
Мы можем использовать метод iterator() для доступа к элементам списка. Для использования этого метода нам нужно импортировать пакет java.util.Iterator.
import java.util.LinkedList; import java.util.Iterator; class Main { public static void main(String[] args) { //Создание списка LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: " + animals); //Использование метода iterator() System.out.println("LinkedList использует метод iterator():"); Iterator<String> iterate = animals.iterator(); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); {} {} {}
Результат вывода
LinkedList: [Коровы, Кошки, Собаки] LinkedList использует метод iterator(): Коровы, Кошки, Собаки
LinkedList и ArrayList оба реализуют интерфейс List из фреймворка Collections. Но между ними есть некоторые различия.
LinkedList | ArrayList |
---|---|
Сохраняет три значения (предыдущий адрес, данные и следующий адрес) в одном положении | Сохраняет один элемент в одном положении |
Предоставляет реализацию двунаправленного списка для list | Предоставляет реализацию изменяемого массива |
Каждый раз, когда добавляется элемент, изменяются предыдущие и следующие адреса | Каждый раз, когда добавляется элемент, все элементы после этого положения перемещаются |
Для доступа к элементам, нам нужно начать итерацию с начала до элемента | Элементы могут быть accessed с помощью индекса для случайного доступа. |