В данной практической работе требуется создать собственную реализацию двусвязного списка LinkedList.
Двусвязный список - это структура данных, представляющая собой последовательность элементов, каждый из которых содержит ссылку на предыдущий и следующий элемент в списке. Каждый элемент двусвязного списка называется узлом.
Узел содержит два указателя (ссылки): один на предыдущий узел (prev), и второй на следующий узел (next). Кроме того, узел хранит данные (значение элемента), которое может быть любого типа.
Голова списка - это первый элемент, у которого нет указателя на предыдущий элемент. Хвост списка - это последний элемент, у которого нет указателя на следующий элемент.
Для выполнения задания необходимо дополнить созданный класс LinkedList следующим функционалом:
- Класс
LinkedListдолжен быть обобщенным, то есть способным хранить элементы любого типа.
LinkedList<String> stringList = new LinkedList<>();
LinkedList<Integer> integerList = new LinkedList<>();
- Класс должен иметь функционал добавления элемента в конец список через метод
add:
LinkedList<String> list = new LinkedList<>();
list.add("Новая строка");
list.add("Еще одна строка");
// Список: ["Новая строка", "Еще одна строка"]
- Класс должен иметь функционал удаления элемента из списка через метод
remove(Element e)
LinkedList<Integer> list = new LinkedList<>();
list.add(4);
list.add(2);
list.add(3);
list.remove(2);
// Список: [4, 3]
- Класс должен иметь метод
size()для получения размера списка:
LinkedList<String> list = new LinkedList<>();
list.add("Строка #1");
list.add("Строка #2");
list.add("Строка #3");
int size = list.size();
// size = 3
// Список: ["Строка #1", "Строка #2", "Строка #3"]
- Класс должен иметь возможность объединять два списка, вставляя передаваемый список в конец:
LinkedList<String> list = new LinkedList<>();
list.add("Строка");
LinkedList<String> newList = new LinkedList<>();
list.add("Строка нового списка #1");
list.add("Строка нового списка #2");
list.addAll(newList);
// Список: ["Строка", "Строка нового списка #1", "Строка нового списка #2"]
Также должен присутствовать функционал объединения функционала со списком, элементы которого являются подтипами элементов исходного:
class A {}
class B extends A {}
LinkedList<A> listA = new LinkedList<>();
listA.add(new A());
LinkedList<B> listB = new LinkedList<>();
listB.add(new B());
listA.addAll(listB);
Для тестирования вашей реализации LinkedList предлагается использовть написанные Unit-тесты. Чтобы их запустить, стоит открыть найти класс LinkedListTest в папке src/test и нажать на зеленый треугольник. При первом запуске класс с тестом не сможет скомпилироваться.
image
Вашей задачей будет доработка класса LinkedList так, чтобы тест успешно компилировался, запускался и все методы проходили успешно.
- Не измененяйте класс
LinkedListTest - Не используйте классы из
java.util - Авторское решение можно подсмотреть в ветке final