Zhrnutie na Spojkový zoznam
Spojkový Zoznam: Rozbor, Typy, Operácie a Porovnanie
Spojkové zoznamy: Podrobný sprievodca
Spojkové zoznamy sú jednou zo základných a najdôležitejších dátových štruktúr v informatike. Na rozdiel od polí, ktoré ukladajú prvky v súvislej oblasti pamäte, spojkové zoznamy ukladajú prvky nesúvisle. Každý prvok pritom obsahuje okrem dátovej hodnoty aj odkaz (ukazovateľ) na nasledujúci prvok. Táto flexibilita v usporiadaní pamäte prináša významné výhody pri určitých typoch operácií, ale aj určité nevýhody, ktoré si podrobnejšie rozoberieme.
Základné pojmy: Uzol a ukazovateľ
Srdcom spojkového zoznamu je uzol. Každý uzol je samostatný objekt, ktorý typicky obsahuje dve hlavné časti:
- Dátová časť: Obsahuje skutočnú hodnotu alebo informáciu, ktorú chceme uložiť (napríklad celé číslo, reťazec, objekt). Typ dátovej časti závisí od konkrétnej aplikácie.
- Ukazovateľ (odkaz) na ďalší uzol: Toto je pamäťová adresa, ktorá „ukazuje“ na nasledujúci uzol v sekvencii. Ak je uzol posledným prvkom v zozname, jeho ukazovateľ na ďalší uzol má špeciálnu hodnotu, často označovanú ako
NULL(alebonil), čo signalizuje koniec zoznamu.
Ukazovateľ je premenná, ktorá uchováva pamäťovú adresu inej premennej alebo objektu. V kontexte spojkových zoznamov sú ukazovatele kľúčové pre prepojenie uzlov a umožňujú prechádzanie zoznamom.
Celý spojkový zoznam je typicky reprezentovaný ukazovateľom na svoj prvý uzol, ktorý sa často nazýva hlava (head). Ak je zoznam prázdny, hlava má hodnotu NULL.
Typy spojkových zoznamov
Existuje niekoľko variantov spojkových zoznamov, ktoré sa líšia spôsobom prepojenia uzlov:
- Jednosmerný spojkový zoznam (Singly Linked List): Toto je najjednoduchší typ. Každý uzol obsahuje dátovú hodnotu a ukazovateľ na nasledujúci uzol. Prechádzanie zoznamom je možné len v jednom smere, od začiatku ku koncu.
- Obojsmerný spojkový zoznam (Doubly Linked List): Tento typ je robustnejší. Každý uzol obsahuje dátovú hodnotu a dva ukazovatele: jeden na nasledujúci uzol (
next) a druhý na predchádzajúci uzol (prev). To umožňuje prechádzanie zoznamom v oboch smeroch (dopredu aj dozadu), čo zjednodušuje niektoré operácie, ako je mazanie uzla alebo vkladanie pred konkrétny uzol. Ukazovateľprevprvého uzla a ukazovateľnextposledného uzla majú hodnotuNULL. - Cyklický spojkový zoznam (Circular Linked List): V tomto variante ukazovateľ
nextposledného uzla neukazuje naNULL, ale na prvý uzol zoznamu. Ak ide o obojsmerný cyklický zoznam, ukazovateľprevprvého uzla ukazuje na posledný uzol. Cyklické zoznamy sú užitočné pre implementáciu kruhových bufferov alebo pre situácie, kde je potrebné neustále prechádzať zoznamom.
Operácie so spojkovým zoznamom
Hlavné operácie, ktoré sa vykonávajú so spojkovými zoznamami, sú vkladanie, mazanie a prístup k prvkom.
Vkladanie prvkov
Vkladanie nového uzla do spojkového zoznamu zahŕňa zmenu ukazovateľov. Časová zložitosť vkladania sa líši v závislosti od miesta vloženia.
- Vkladanie na začiatok ($O(1)$): Toto je najefektívnejšia operácia vkladania. Nový uzol sa vytvorí, jeho dátová časť sa naplní a jeho ukazovateľ
nextsa nastaví na aktuálnuhlavuzoznamu. Následne sahlavazoznamu aktualizuje tak, aby ukazovala na nový uzol. V prípade obojsmerného zoznamu je potrebné aktualizovať aj ukazovateľprevpôvodnej hlavy, aby ukazoval na nový uzol, a ukazovateľprevnového uzla sa nastaví naNULL.- Príklad: Máme zoznam $10 \to 20 \to 30$. Chceme vložiť $5$ na začiatok.
- Vytvoríme nový uzol s hodnotou $5$. Jeho
nextje zatiaľNULL. - Nastavíme
novy_uzol.nextnahlava(ktorá ukazuje na $10$). - Ak je zoznam obojsmerný, nastavíme
hlava.prev(uzol $10$) nanovy_uzol. - Nastavíme
hlavananovy_uzol.
- Vytvoríme nový uzol s hodnotou $5$. Jeho
- Príklad: Máme zoznam $10 \to 20 \to 30$. Chceme vložiť $5$ na začiatok.
Už máš účet? Prihlásiť sa
Spojkové zoznamy
Klíčová slova: Spojkové zoznamy
Klíčové pojmy: Spojkový zoznam ukladá prvky nesúvisle, prepojené ukazovateľmi., Každý uzol obsahuje dátovú časť a ukazovateľ na ďalší uzol., `Hlava` zoznamu ukazuje na prvý uzol; `NULL` signalizuje koniec alebo prázdny zoznam., Existujú jednosmerné, obojsmerné (s ukazovateľmi `next` a `prev`) a cyklické zoznamy., Vkladanie a mazanie na začiatku/konci môže byť $O(1)$, v strede $O(n)$., Prístup k prvkom je $O(n)$, na rozdiel od polí s $O(1)$., Spojkové zoznamy majú dynamickú veľkosť, ale vyššiu pamäťovú réžiu., Kritické je správne aktualizovať všetky ukazovatele a vyhýbať sa dereferencovaniu `NULL`., Simulácie a vizualizácie pomáhajú pochopiť dynamiku ukazovateľov a operácií., Časté chyby zahŕňajú nesprávnu aktualizáciu ukazovateľov a pamäťové úniky.