Список — различия между версиями
| Строка 1: | Строка 1: | ||
| − | Связный список - структура данных, состоящая из узлов, содержащих помимо собственных данных ссылки на следующий или предыдущий узел списка. С помощью списков можно реализовать такие структуры данных как [[стек]] и [[очередь]].Вставка и удаление в списке работают за O(1). | + | Связный список - структура данных, состоящая из узлов, содержащих помимо собственных данных ссылки на следующий или предыдущий узел списка. С помощью списков можно реализовать такие структуры данных как [[стек]] и [[очередь]]. Вставка и удаление в списке работают за O(1). |
__TOC__ | __TOC__ | ||
==Односвязный список == | ==Односвязный список == | ||
| − | Простейшай реализация. В узлах хранятся данные и указатель на следующий элемент в списке. | + | Простейшай реализация списка. В узлах хранятся данные и указатель на следующий элемент в списке. |
[[Файл:Single linked list-1-.png|center|400px]] | [[Файл:Single linked list-1-.png|center|400px]] | ||
==Двусвязный список == | ==Двусвязный список == | ||
| Строка 13: | Строка 13: | ||
Первый элемент является следующим для последнего элемента списка. | Первый элемент является следующим для последнего элемента списка. | ||
[[Файл:Circurlar linked list.png (872×241).png|center|400px]] | [[Файл:Circurlar linked list.png (872×241).png|center|400px]] | ||
| + | ==Операции в связном списке== | ||
| + | ===Поиск=== | ||
| + | find(k) | ||
| + | { | ||
| + | x = head; | ||
| + | while ((x->key != k)&&(x != NULL)) | ||
| + | x = x -> next; | ||
| + | return x; | ||
| + | } | ||
| + | |||
| + | Поиск в худшем случае выполняется за <math>\Theta(n)</math>, так как может понадобиться просмотреть весь список. | ||
| + | ===Вставка=== | ||
| + | insert(k) | ||
| + | { | ||
| + | tmp = head; | ||
| + | x->key = k; | ||
| + | x->next = tmp; | ||
| + | head = x; | ||
| + | } | ||
| + | Время работы вставки O(1). | ||
| + | ===Удаление=== | ||
| + | Само удаление работает за O(1), но если требуется сначала найти удаляемый элемент, то на поиск + удаление потребуется <math>\Theta(n)</math> времени. | ||
==См.также== | ==См.также== | ||
[[Массив с увеличением/уменьшением размера]] | [[Массив с увеличением/уменьшением размера]] | ||
Версия 21:17, 3 мая 2011
Связный список - структура данных, состоящая из узлов, содержащих помимо собственных данных ссылки на следующий или предыдущий узел списка. С помощью списков можно реализовать такие структуры данных как стек и очередь. Вставка и удаление в списке работают за O(1).
Содержание
Односвязный список
Простейшай реализация списка. В узлах хранятся данные и указатель на следующий элемент в списке.
Двусвязный список
Также хранится указатель на предыдущий элемент списка, благодаря чему становится проще удалять и переставлять элементы.
XOR-связный список
XOR-связный список — структура данных, похожая на обычный двусвязный список, однако в каждом элементе хранящая только один адрес — результат выполнения операции XOR над адресами предыдущего и следующего элементов списка. Для того, чтобы перемещаться по списку, необходимо взять два последовательных адреса и выполнить над ними операцию XOR, которая и даст реальный адрес следующего элемента.
Циклический список
Первый элемент является следующим для последнего элемента списка.
Операции в связном списке
Поиск
find(k)
{
x = head;
while ((x->key != k)&&(x != NULL))
x = x -> next;
return x;
}
Поиск в худшем случае выполняется за , так как может понадобиться просмотреть весь список.
Вставка
insert(k)
{
tmp = head;
x->key = k;
x->next = tmp;
head = x;
}
Время работы вставки O(1).
Удаление
Само удаление работает за O(1), но если требуется сначала найти удаляемый элемент, то на поиск + удаление потребуется времени.
См.также
Массив с увеличением/уменьшением размера
Ссылки
http://en.wikipedia.org/wiki/Linked_list Linked list
Литература
- Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ глава 11.2
- Д. Кнут: Искусство программирования том 1 глава 2.2