Egy forgalmas vasúti hálózat menetrendtervező rendszerének fejlesztésén dolgozol.
Arra kértek, hogy prototípust készíts a menetrendtervező rendszer vonatútvonalaihoz. Minden útvonal azoknak a vasútállomásoknak a sorából áll, ahol az adott vonat megáll.
A csapatod úgy döntött, hogy a menetrendben szereplő minden vonatútvonalat kétszeresen láncolt listával ábrázol. A vonat útvonalán minden állomást egy-egy csomópont képvisel a láncolt listában.
Nem kell az állomások érkezési és indulási idejével foglalkoznod. Minden állomást egyszerűen egy szám ábrázol.
Az útvonalak bővíthetők: új állomásokat adhatsz az útvonal elejére vagy végére. Rövidíthetők is, ha eltávolítod az állomásokat az útvonal elejéről vagy végéről.
Néha bezárnak egy állomást, és ilyenkor el kell távolítani az útvonalról, akkor is, ha nem az útvonal elején vagy végén van.
Az útvonal hosszát nem az méri, hogy milyen messzire utazik a vonat, hanem az, hogy hány állomáson áll meg.
A láncolt lista alapvető adatszerkezet a számítástechnikában, és gyakran más adatszerkezetek megvalósításához használják. Ahogy a neve is sugallja, olyan csomópontok listája, amelyek össze vannak kapcsolva egymással. Olyan „csomópontok” listája, ahol minden csomópont a szomszédjához vagy a szomszédaihoz kapcsolódik. Egy egyszeresen láncolt listában minden csomópont csak az őt követő csomópontra mutat. Egy kétszeresen láncolt listában minden csomópont kapcsolódik az előtte lévő és az utána következő csomóponthoz is.
Ha mélyebbre szeretnél ásni a láncolt listák világában, nézd meg ezt a cikket, amely szép ábrák segítségével magyarázza el őket.
Bár a láncolt listák sokféleképpen megvalósíthatók, sokféle mögöttes adatszerkezettel, itt arra kérünk, hogy a láncolt listádat objektumorientált módon valósítsd meg.
A vázfájlban meglátod a Node osztály kezdetét, valamint egy LinkedList osztályt is.
A Node osztályodnak nyilván kell tartania az értékét, valamint azt is, hogy mely csomópontok előzik meg, illetve követik.
A push, pop, shift, unshift metódust, valamint a len-hez tartozó speciális metódust a LinkedList osztályban kell megvalósítanod.
Az iterációhoz hasznos lehet egy speciális iter metódust is megvalósítanod.
Az alapfeladattal ellentétben itt hibaeseteket is tesztelünk majd úgy, hogy pop és shift metódust hívunk üres LinkedList-eken, ezért a hibákat megfelelően kell raise-elned.
Végül szeretnénk, ha a fent vázolt metódusokon kívül a delete metódust is megvalósítanád.
A delete egyetlen argumentumot vár: azt az értéket, amelyet el kell távolítani a láncolt listából.
Ha az érték többször is szerepel, csak az első előfordulását kell eltávolítani.
Néha szükség van arra, hogy kivételt dobj. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely megmutatja, mi a hiba forrása. Ez olvashatóbbá teszi a kódodat, és nagyban segít a hibakeresésben. Ha tudod, hogy a hibaforrás egy adott típusú lesz, választhatsz a beépített hibatípusok közül, de ilyenkor is adj meg beszédes üzenetet.
Ez a feladat megköveteli, hogy a raise utasítással „dobj” ValueError-t, ha a delete()-el törölni kívánt csomópontérték nem található a láncolt listában.
Ezen kívül IndexError-t kell dobni, ha nem maradt csomópont, amit pop()-pal ki lehetne venni.
A tesztek csak akkor futnak le sikeresen, ha raise-eled ezeket az exceptions, és üzenetet is fűzöl hozzájuk.
Ha üzenettel együtt szeretnél ValueError-t dobni, írd az üzenetet az exception típus argumentumaként:
# When the value passed to `delete()` is not found.
if not found:
raise ValueError("Value not found")
Ha üzenettel együtt szeretnél IndexError-t dobni, írd az üzenetet az exception típus argumentumaként:
# When pop() is called and there are no nodes left in the linked list
if self.length == 0:
raise IndexError("List is empty")
A feladat tesztjei a LinkedLists-eden a len() függvényt is hívni fogják.
Ahhoz, hogy a len() működjön, létre kell hoznod egy __len__ speciális metódust.
A speciális, más néven „dunder” metódusok Pythonbeli megvalósításáról a Python dokumentáció: objektumok alapvető testreszabása és a Python dokumentáció: object.len(self) oldalon olvashatsz.
Javasoljuk továbbá egy speciális __iter__ metódus létrehozását is, amely segít a láncolt listádon való iterálásban.
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.