Связные списки: введение
Как и массивы, связные списки являются линейной структурой данных. Но в отличие от массивов, элементы связного списка не хранятся в смежном расположении; они связаны с помощью указателей.
Почему 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.