Связные списки: введение
Как и массивы, связные списки являются линейной структурой данных. Но в отличие от массивов, элементы связного списка не хранятся в смежном расположении; они связаны с помощью указателей.
Почему LinkedList?
Массивы могут использоваться для хранения линейных данных аналогичных типов, но имеют следующие ограничения.
- размер массивов фиксирован: поэтому мы должны заранее знать верхний предел количества элементов. Также, как правило, выделяемая память равна верхнему пределу независимо от использования.
- вставка нового элемента в массив элементов является затратной операцией, так как для новых элементов необходимо создать место, а для создания места необходимо переместить существующие элементы.
id[] = [1000, 1010, 1050, 2000, 2040].И если мы хотим вставить новый ID 1005, то для поддержания отсортированного порядка, мы должны переместить все элементы после 1000 (исключая 1000).
Удаление также дорого обходится в массивах до тех пор, пока не будут использованы некоторые специальные методы. Например, чтобы удалить 1010 в id [], все после 1010 должно быть перемещено.
Преимущества над массивами
- динамический размер
- легкость вставки / удаления
- случайный доступ не допускается. Мы должны получить доступ к элементам последовательно, начиная с первого узла. Таким образом, мы не можем эффективно выполнять двоичный поиск со связанными списками с его реализацией по умолчанию.
- с каждым элементом списка требуется дополнительное место для указателя.
- нет кэширования. Поскольку элементы массива являются смежными местоположениями, существует локальность ссылки, которой нет в случае связанных списков.
- Данные
- указатель (или ссылка) на следующий узел
class LinkedList
{
Node head;
class Node
{
int data;
Node next;
// Конструктор для создания ноды
// Инициализируется по умолчанию как null
Node(int d) {data = d;}
}
}
Давайте создадим простой связный список на Java с тремя узлами
class LinkedList
{
Node head; // голова списка
static class Node {
int data;
Node next;
Node(int d) { data = d; next=null; } // конструктор
}
/* метод, создающий простой связный список на Java с тремя узлами */
public static void main(String[] args)
{
/* начинаем с пустого списка. */
LinkedList llist = new LinkedList();
llist.head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
/* Три узла распределены динамически.
У нас есть ссылки на эти три блока, как первый,
второй и третий
llist.head second third
| | |
| | |
+----+------+ +----+------+ +----+------+
| 1 | null | | 2 | null | | 3 | null |
+----+------+ +----+------+ +----+------+ */
llist.head.next = second; // связываем первый со вторым
/* Теперь следующий из первого узла относится ко второму. Так они
оба связаны.
llist.head second third
| | |
| | |
+----+------+ +----+------+ +----+------+
| 1 | o-------->| 2 | null | | 3 | null |
+----+------+ +----+------+ +----+------+ */
second.next = third; // ссылка второго узла на третий узел
/* Теперь следующий из второго узла относится к третьему. Итак, все три
узлы связаны.
llist.head second third
| | |
| | |
+----+------+ +----+------+ +----+------+
| 1 | o-------->| 2 | o-------->| 3 | null |
+----+------+ +----+------+ +----+------+ */
}
}
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты