mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-09-20 15:53:02 +08:00
Merge branch 'master' into fibonacci
This commit is contained in:
commit
d37f582a1c
156
src/data-structures/linked-list/READM.ru-RU.md
Normal file
156
src/data-structures/linked-list/READM.ru-RU.md
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
# Связный список
|
||||||
|
Связный список — базовая динамическая структура данных в информатике,
|
||||||
|
состоящая из узлов, каждый из которых содержит как собственно данные,так ссылку
|
||||||
|
(«связку») на следующий узел списка. Данная структура позволяет эффективно
|
||||||
|
добавлять и удалять элементы на произвольной позиции в последовательности в
|
||||||
|
процессе итерации. Более сложные варианты включают дополнительные ссылки,
|
||||||
|
позволяющие эффективно добавлять и удалять произвольные элементы.
|
||||||
|
|
||||||
|
Принципиальным преимуществом перед массивом является структурная гибкость:
|
||||||
|
порядок элементов связного списка может не совпадать с порядком расположения
|
||||||
|
элементов данных в памяти компьютера, а порядок обхода списка всегда
|
||||||
|
явно задаётся его внутренними связями. Суть преимущества состоит в том,
|
||||||
|
что во многих языках создание массива требует указать его размер заранее.
|
||||||
|
Связный список позволяет обойти это ограничение.
|
||||||
|
|
||||||
|
Недостатком связных списков является то, что время доступа линейно
|
||||||
|
(и затруднительно для реализации конвейеров). Быстрый доступ(случайный)
|
||||||
|
невозможен.
|
||||||
|
|
||||||
|
![Связный список](https://upload.wikimedia.org/wikipedia/commons/6/6d/Singly-linked-list.svg)
|
||||||
|
|
||||||
|
## Псевдокод основных операций
|
||||||
|
|
||||||
|
### Вставка
|
||||||
|
|
||||||
|
```text
|
||||||
|
Add(value)
|
||||||
|
Pre: value - добавляемое значение
|
||||||
|
Post: value помещено в конец списка
|
||||||
|
n ← node(value)
|
||||||
|
if head = ø
|
||||||
|
head ← n
|
||||||
|
tail ← n
|
||||||
|
else
|
||||||
|
tail.next ← n
|
||||||
|
tail ← n
|
||||||
|
end if
|
||||||
|
end Add
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
Prepend(value)
|
||||||
|
Pre: value - добавляемое значение
|
||||||
|
Post: value помещено в начало списка
|
||||||
|
n ← node(value)
|
||||||
|
n.next ← head
|
||||||
|
head ← n
|
||||||
|
if tail = ø
|
||||||
|
tail ← n
|
||||||
|
end
|
||||||
|
end Prepend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Поиск
|
||||||
|
|
||||||
|
```text
|
||||||
|
Contains(head, value)
|
||||||
|
Pre: head - первый узел в списке
|
||||||
|
value - значение, которое следует найти
|
||||||
|
Post: true - value найдено в списке, иначе false
|
||||||
|
n ← head
|
||||||
|
while n != ø and n.value != value
|
||||||
|
n ← n.next
|
||||||
|
end while
|
||||||
|
if n = ø
|
||||||
|
return false
|
||||||
|
end if
|
||||||
|
return true
|
||||||
|
end Contains
|
||||||
|
```
|
||||||
|
|
||||||
|
### Удаление
|
||||||
|
|
||||||
|
```text
|
||||||
|
Remove(head, value)
|
||||||
|
Pre: head - первый узел в списке
|
||||||
|
value - значение, которое следует удалить
|
||||||
|
Post: true - value удалено из списка, иначе false
|
||||||
|
if head = ø
|
||||||
|
return false
|
||||||
|
end if
|
||||||
|
n ← head
|
||||||
|
if n.value = value
|
||||||
|
if head = tail
|
||||||
|
head ← ø
|
||||||
|
tail ← ø
|
||||||
|
else
|
||||||
|
head ← head.next
|
||||||
|
end if
|
||||||
|
return true
|
||||||
|
end if
|
||||||
|
while n.next != ø and n.next.value != value
|
||||||
|
n ← n.next
|
||||||
|
end while
|
||||||
|
if n.next != ø
|
||||||
|
if n.next = tail
|
||||||
|
tail ← n
|
||||||
|
end if
|
||||||
|
n.next ← n.next.next
|
||||||
|
return true
|
||||||
|
end if
|
||||||
|
return false
|
||||||
|
end Remove
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обход
|
||||||
|
|
||||||
|
```text
|
||||||
|
Traverse(head)
|
||||||
|
Pre: head - первый узел в списке
|
||||||
|
Post: элементы списка пройдены
|
||||||
|
n ← head
|
||||||
|
while n != ø
|
||||||
|
yield n.value
|
||||||
|
n ← n.next
|
||||||
|
end while
|
||||||
|
end Traverse
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обратный обход
|
||||||
|
|
||||||
|
```text
|
||||||
|
ReverseTraversal(head, tail)
|
||||||
|
Pre: head и tail отноcятся к одному списку
|
||||||
|
Post: элементы списка пройдены в обратном порядке
|
||||||
|
if tail != ø
|
||||||
|
curr ← tail
|
||||||
|
while curr != head
|
||||||
|
prev ← head
|
||||||
|
while prev.next != curr
|
||||||
|
prev ← prev.next
|
||||||
|
end while
|
||||||
|
yield curr.value
|
||||||
|
curr ← prev
|
||||||
|
end while
|
||||||
|
yeild curr.value
|
||||||
|
end if
|
||||||
|
end ReverseTraversal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Сложность
|
||||||
|
|
||||||
|
### Временная сложность
|
||||||
|
|
||||||
|
| Чтение | Поиск | Вставка | Удаление |
|
||||||
|
| :-------: | :-------: | :-------: | :-------: |
|
||||||
|
| O(n) | O(n) | O(1) | O(1) |
|
||||||
|
|
||||||
|
### Пространственная сложность
|
||||||
|
|
||||||
|
O(n)
|
||||||
|
|
||||||
|
## Ссылки
|
||||||
|
|
||||||
|
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)
|
||||||
|
- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
|
@ -1,5 +1,9 @@
|
|||||||
# Linked List
|
# Linked List
|
||||||
|
|
||||||
|
_Read this in other languages:_
|
||||||
|
[_简体中文_](README.zh-CN.md),
|
||||||
|
[_Русский_](README.ru-RU.md)
|
||||||
|
|
||||||
In computer science, a **linked list** is a linear collection
|
In computer science, a **linked list** is a linear collection
|
||||||
of data elements, in which linear order is not given by
|
of data elements, in which linear order is not given by
|
||||||
their physical placement in memory. Instead, each
|
their physical placement in memory. Instead, each
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# 栈
|
# 栈
|
||||||
|
|
||||||
在计算机科学中, 一个 **栈(stack)** 时一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
|
在计算机科学中, 一个 **栈(stack)** 是一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
|
||||||
|
|
||||||
* **push**, 添加元素到栈的顶端(末尾);
|
* **push**, 添加元素到栈的顶端(末尾);
|
||||||
* **pop**, 移除栈最顶端(末尾)的元素.
|
* **pop**, 移除栈最顶端(末尾)的元素.
|
||||||
|
Loading…
Reference in New Issue
Block a user