49 lines
No EOL
2.2 KiB
Markdown
49 lines
No EOL
2.2 KiB
Markdown
# Вывести односвязный список
|
||
|
||
[importance 5]
|
||
|
||
[Односвязный список](http://ru.wikipedia.org/wiki/Связный_список) -- это структура данных, которая состоит из *элементов*, каждый из которых хранит ссылку на следующий. Последний элемент может не иметь ссылки, либо она равна `null`.
|
||
|
||
Например, объект ниже задаёт односвязный список, в `next` хранится ссылка на следующий элемент:
|
||
|
||
```js
|
||
var list = {
|
||
value: 1,
|
||
next: {
|
||
value: 2,
|
||
next: {
|
||
value: 3,
|
||
next: {
|
||
value: 4,
|
||
next: null
|
||
}
|
||
}
|
||
}
|
||
};
|
||
```
|
||
|
||
Графическое представление этого списка:
|
||
<img src="linked-list.svg">
|
||
|
||
Альтернативный способ создания:
|
||
|
||
```js
|
||
var list = { value: 1 };
|
||
list.next = { value: 2 };
|
||
list.next.next = { value: 3 };
|
||
list.next.next.next = { value: 4 };
|
||
```
|
||
|
||
Такая структура данных интересна тем, что можно очень быстро разбить список на части, объединить списки, удалить или добавить элемент в любое место, включая начало. При использовании массива такие действия требуют обширных перенумерований.
|
||
|
||
Задачи:
|
||
|
||
<ol>
|
||
<li>Напишите функцию `printList(list)`, которая выводит элементы списка по очереди, при помощи цикла.</li>
|
||
<li>Напишите функцию `printList(list)` при помощи рекурсии.</li>
|
||
<li>Напишите функцию `printReverseList(list)`, которая выводит элементы списка в обратном порядке, при помощи рекурсии.
|
||
Для списка выше она должна выводить `4`,`3`,`2`,`1`</li>
|
||
<li>Сделайте вариант `printReverseList(list)`, использующий не рекурсию, а цикл.</li>
|
||
</ol>
|
||
|
||
Как лучше -- с рекурсией или без? |