Kurzusok
/
Python
Python
/
Feladatok
/
Egyszerű láncolt lista
Egyszerű láncolt lista

Egyszerű láncolt lista

Könnyű

Bevezetés

Egy zenei streamingcégnél dolgozol.

Az a feladatod, hogy egy lejátszásilista-funkciót készíts a zenelejátszó alkalmazásodhoz.

Utasítások

Írj egy prototípust a zenelejátszó alkalmazáshoz.

A prototípusban minden dalt egyszerűen egy szám képvisel.

Egy számtartományból (a dalok azonosítói) hozz létre egy egyszeresen láncolt listát.

Egy egyszeresen láncolt listát meg tudsz fordítani, hogy a dalokat ellenkező sorrendben játszd le.

Note

A láncolt lista az informatika egyik alapvető adatszerkezete, amelyet gyakran más adatszerkezetek megvalósításához használnak.

A láncolt lista legegyszerűbb fajtája az egyszeresen láncolt lista. Ez azt jelenti, hogy minden elem (vagy „csomópont”) tartalmaz adatot, valamint valamit, ami a listában a következő csomópontra mutat.

Ha mélyebbre szeretnél ásni a láncolt listákban, nézd meg ezt a cikket, amely szép ábrákkal magyarázza el.

Hogyan épül fel ez a feladat Pythonban

Bár a stacks és a queues megvalósítható lists, collections.deque, queue.LifoQueue és multiprocessing.Queue használatával, ez a feladat egy „Last in, First Out” (LIFO) vermet vár el, amely egy saját készítésű egyszeresen láncolt listát használ:


Vermet ábrázoló diagram, amely láncolt listával van megvalósítva. Egy szaggatott szegélyű kör, amelynek neve New_Node, a bal szélen található, és két pontozott nyílvonal mutat jobbra. A New_Node felirata: „(becomes head) - New_Node - next = node_6”. A felső pontozott nyílvonal címkéje „push”, és a jobbra feljebb lévő Node_6-ra mutat. A Node_6 felirata: „(current) head - Node_6 - next = node_5”. Az alsó pontozott nyílvonal címkéje „pop”, és egy olyan dobozra mutat, amelynek felirata: „gets removed on pop()”. A Node_6-ból egy folytonos nyíl mutat jobbra a Node_5-re, amelynek felirata: „Node_5 - next = node_4”. A Node_5-ből egy folytonos nyíl mutat jobbra a Node_4-re, amelynek felirata: „Node_4 - next = node_3”. Ez a minta folytatódik egészen a Node_1-ig, amelynek felirata: „(current) tail - Node_1 - next = None”. A Node_1-ből egy pontozott nyíl mutat jobbra egy olyan csomópontra, amelynek felirata: „None”.


Ezt nem szabad összekeverni a LIFO vermet dinamikus tömbbel vagy listával megvalósító változattal, amely alul list-et, queue-t vagy array-t használhat. A dinamikus tömbön alapuló stacks-nek más a head pozíciója, más az időbonyolultsága (Big-O) és más a memóriaigénye.


Vermet ábrázoló diagram, amely tömb/dinamikus tömb segítségével van megvalósítva. Egy szaggatott szegélyű doboz, amelynek neve New_Node, a jobb szélen található, és két pontozott nyílvonal mutat balra. A New_Node felirata: „(becomes head) - New_Node”. A felső pontozott nyílvonal címkéje „append”, és a balra feljebb lévő Node_6-ra mutat. A Node_6 felirata: „(current) head - Node_6”. Az alsó pontozott nyílvonal címkéje „pop”, és egy szaggatott körvonalú dobozra mutat, amelynek felirata: „gets removed on pop()”. A Node_6-ból egy folytonos nyíl mutat balra a Node_5-re. A Node_5-ből egy folytonos nyíl mutat balra a Node_4-re. Ez a minta folytatódik egészen a Node_1-ig, amelynek felirata: „(current) tail - Node_1”.


Nézz meg két Stack Overflow-kérdést néhány szempont átgondolásához: Tömbalapú vs. listaalapú vermek és sorok és Különbségek a tömbalapú verem, a láncolt verem és a verem között. A láncolt listákról, a LIFO vermekről és más absztrakt adattípusokról (ADT) Pythonban további részleteket itt találsz:


Osztályok Pythonban

A láncolt lista „kanonikus” implementációja Pythonban általában egy vagy több class-t igényel. A class-ek jó bevezetőjéhez lásd a classes fogalmat és a hozzá tartozó ellens-alien-game feladatot, vagy a A hivatalos Python-oktatóanyag osztályokról szóló része című részt.


Speciális metódusok Pythonban

A feladat tesztjei a len() függvényt fogják meghívni a LinkedList-eden. Ahhoz, hogy a len() működjön, létre kell hoznod egy __len__ speciális metódust. A speciális vagy „dunder” metódusok Pythonbeli megvalósításáról lásd a Python-dokumentáció: Az objektumok alapvető testreszabása és a Python-dokumentáció: object.len(self) című részt.


Iterátor készítése

Ahhoz, hogy a LinkedList-eden végig lehessen iterálni vagy meg lehessen fordítani, meg kell valósítanod a __iter__ speciális metódust. A megvalósítás részleteiért lásd az iterátor implementálása egy osztályhoz című részt.


Kivételek testreszabása és kiváltása

Néha a kódodban egyszerre kell testre szabnod és raise a kivételeket. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely jelzi, mi a hiba forrása. Ettől olvashatóbb lesz a kódod, és a hibakeresést is jelentősen megkönnyíti.

Egyedi kivételeket új kivételosztályok létrehozásával hozhatsz létre (részletekért lásd a classes részt), amelyek általában a Exception leszármazottai.

Ha tudod, hogy a hiba forrása egy bizonyos kivétel_típus_ leszármazottja lesz, akkor választhatod azt is, hogy az Exception osztály alatti built in error types egyikéből örökölsz. A hiba kiváltásakor ilyenkor is adj meg egy beszédes üzenetet.

Ez a feladat azt kéri, hogy hozz létre egy egyedi kivételt, amelyet kiváltani/„dobni” kell, amikor a láncolt listád üres. A tesztek csak akkor lesznek sikeresek, ha testre szabod a megfelelő kivételeket, raise-eled őket, és megfelelő hibaüzeneteket adsz meg.

Egy általános kivétel testre szabásához hozz létre egy class-t, amely a Exception-ből örököl. Amikor üzenettel együtt váltod ki az egyedi kivételt, az üzenetet a exception típus argumentumaként add meg:

# subclassing Exception to create EmptyListException
class EmptyListException(Exception):
    """Exception raised when the linked list is empty.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

# raising an EmptyListException
raise EmptyListException("The list is empty.")
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

Készen állsz elkezdeni a(z) Egyszerű láncolt lista feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.