Ruby Linked Lists

pro toto cvičení implementujeme jednoduchou verzi jednotlivě propojeného seznamu. Ale nejprve se dozvíme, co je propojený seznam a proč byste se měli starat.

propojený seznam datová struktura, která se používá pro rychlé a paměťové efektivní Vložení a odstranění. Na rozdíl od polí, které jsou jednotlivé objekty, propojené seznamy obsahují více objektů „uzlu“, které jsou propojeny pomocí odkazů.

propojené seznamy mohou být buď jednotlivě nebo dvojnásobně propojeny. Prozatím se zaměříme na jednotlivé propojené seznamy.

Singly Linked List

pokud jsou propojené seznamy více objektů propojených dohromady, v ideálním případě potřebujeme několik různých objektů.

  1. LinkedList objekt, který obsahuje všechny objekty v seznamu

  2. objekt uzlu, který obsahuje data pro prvek, stejně jako odkaz na další uzel v seznamu.

počkat, proč místo toho nepoužívat pole?

v jazycích nižší úrovně jsou pole alokována v blocích. Proto jsou pole statické velikosti a mohou obsahovat pouze určitý datový typ. Propojené seznamy ukládají data do haldy, což znamená, že data mohou být uložena neorganizovaným způsobem. Protože každý uzel ukazuje na další, je stále možné zachovat strukturu seznamu.

Začínáme

nejlepší způsob, jak pochopit, jak propojené seznamy fungují, je vytvořit jeden! Udělejme to v Ruby. Tady je postup.

  1. Začněte vytvořením třídy Node. Budeme mít atributy, které reprezentují data (nazvěme to @data) a odkaz na další uzel (nazvěme to @next).

  2. Vytvořte třídu LinkedList. Tato třída bude mít dvě hodnoty, @head a @tail. Ty budou představovat začátek a konec seznamu. Inicializujte obě na nil. Máme prázdný seznam!

  3. nyní za začlenění obou tříd dohromady. Vytvořte metodu ve třídě LinkedList s názvem insert_front. Úkolem je přidat položku na začátek seznamu. To lze provést vytvořením nového Node a následujícími kroky:

  4. Uložte hodnotu @head do proměnné temp

  5. nastavte @head na nově vytvořené Node. Všimněte si, že v současné době je jeho next odkaz nil.

  6. Přemýšlejte o tom, co bychom museli udělat, pokud přidáváme novou položku na začátek propojeného seznamu. Podívejte se na diagram (tip: budeme muset něco udělat s odkazem next nového uzlu)

  7. nakonec zpracujte speciální případ @tail. @tail by měl být vždy poslední Node v propojeném seznamu.

  8. Vytvořte jinou metodu na LinkedList nebo Node s názvem to_s a vytiskněte seznam do konzoly.

iterace přes propojené seznamy

použijte while loops k iteraci přes propojené seznamy. Zatímco smyčky jsou lepší než pro smyčky zde, protože propojené seznamy nemají vlastnost délky. Namísto iterace for určitý počet opakování jednoduše iterujeme while náš ukazatel current není nil.

Vytvořte lokální proměnnou s názvem current, která začíná ukazovat na kořenový uzel seznamu. Uvnitř smyčky můžete dělat dvě věci:

  1. přístup k hodnotě aktuálního uzlu na current.data

  2. nasměrujte aktuální proměnnou na další položku pomocí current = current.next

BONUS: Vytvořte metodu insert_end pro přidání uzlů na konec seznamu.

SUPER BONUS: Vytvořte univerzálnější metodu insert pro přidání uzlu kdekoli v propojeném seznamu a poskytněte index pro novou položku.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.