from dataclasses import dataclass from typing import Iterator, Optional @dataclass class Node[T]: value: T next_node: Optional['Node[T]'] @dataclass class LinkedList[T]: def __post_init__(self): # unser erstes Element self.__head: Optional[Node[T]] = None # Die Länge der Liste self.__length = 0 def __eq__(self, other: 'LinkedList[T]') -> bool: """Hier wollen wir alle Elemente von dieser Liste mit allen Elementen von einer anderen Liste vergleichen. Hierbei kann man von ausgehen dass T vergleichbar ist. Das Programm sollte nicht abstürzen bei unterschiedlichen längen etc. sondern einfach False zurückgeben""" pass def __iter__(self) -> Iterator[T]: """Hier wollen wir einen Iterator über alle Elemente haben, der Iterator kann leer sein Tipp: Generator""" pass def append(self, value: T) -> None: """Hier wollen wir einfach `value` an das Ende der Liste setzen und die Länge erhöhen""" pass def remove(self, value: T): """Hier wollen wir den Wert `value` aus unserer Liste entfernen, wir können davon ausgehen dass T vergleichbar ist. Wenn wir `value` nicht finden soll einfach nichts passieren""" pass def __len__(self) -> int: """Hier soll die Länge der Liste zurückgegeben werden""" pass def __getitem__(self, index: int) -> T: """_summary_ __getitem__ definiert das verhalten vom [] index operator wobei `index` der Wert ist der in [] übergeben wird Hierbei sollen wir das Item `T` an Stelle `index` zurückgeben und sonst einen IndexError raisen Args: index (int): der Index von dem Item was wir suchen Returns: T: das Item an stelle `index` """ pass