Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке циклічний список (circular linked list)?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Циклічний список (circular linked list)** - це різновид зв'язаного списку, у якому **останній вузол не вказує на** `None`**, а посилається назад на перший вузол (**`head`**)**, утворюючи **замкнуте коло**. **Ключове:** така структура утворює кільце, зручне для реалізації циклічних черг, буферів і процесів, що повторюються.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Циклічний список (circular linked list)** - це різновид зв'язаного списку, у якому **останній вузол не вказує на** `None`**, а посилається назад на перший вузол (**`head`**)**, утворюючи **замкнуте коло**. Тобто під час обходу списку можна рухатися нескінченно по колу - після останнього елемента знову йде перший. --- ### **1. Візуально** **Однозв'язний циклічний список:** ```javascript head → [10 | *] → [20 | *] → [30 | *] ──┐ ↑──────────────────────────────┘ ``` - У останнього вузла `next` вказує на `head`. - Немає "кінця списку" - обхід можна почати з будь-якого вузла і завжди повернутися назад. --- ### **2. Двозв'язний циклічний список** У ньому кожен вузол має і `prev`, і `next`, і обидва вказівники замикаються по колу: ```javascript ↰ [10] ↔ [20] ↔ [30] ↺ ``` - `head.prev = tail` - `tail.next = head` --- ### **3. Як зберігається** Кожен вузол має посилання, як у звичайному списку, але: - при створенні останнього елемента його `next` вказує на `head`, - (у двозв'язному варіанті ще й `head.prev` вказує на `tail`). --- ### **4. Основні операції** | Операція | Складність | Опис | |---|---|---| | **Обхід** | O(n) | Можна обійти, починаючи з будь-якого вузла, але потрібно стежити, щоб не зациклитися. | | **Вставка/видалення за відомого вузла** | O(1) | Просто переназначаються посилання. | | **Пошук** | O(n) | Як і у звичайному списку. | --- ### **5. Переваги** - Можна **обходити список по колу** без перевірки "кінця". - Зручний для **циклічних структур**: черг, буферів, ігрових циклів, кругового розподілу завдань ("round-robin"). - Немає "мертвого кінця" (`None`), кожен вузол пов'язаний з іншими. --- ### **6. Недоліки** - Потрібно **обережно працювати з циклами**, інакше програма може застрягти в нескінченному обході. - Складніше контролювати початок і кінець. --- ### **7. Приклад на Python** ```python class Node: def __init__(self, data): self.data = data self.next = None # створення циклічного списку: 10 → 20 → 30 → назад на 10 n1 = Node(10) n2 = Node(20) n3 = Node(30) n1.next = n2 n2.next = n3 n3.next = n1 # цикл head = n1 ``` --- **Підсумок:** > **Циклічний список** - це зв'язаний список, у якому останній елемент посилається назад на перший. > Така структура утворює **кільце**, зручне для реалізації циклічних черг, буферів і процесів, що повторюються.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.