1+ < h1 id ="linkedAfter "> Linked List: Insert After Node</ h1 >
2+
3+ < p >
4+ In dieser Übung werden Sie die Datenstruktur < strong > Verkettete Liste (Linked List)</ strong > erweitern.
5+ Gegeben sind bereits die Klassen < code > ListNode</ code > und < code > LinkedList</ code > , sowie einige
6+ Hilfsmethoden zur Erzeugung einer verkettenten Liste aus eine Python Liste < code > FromPythonlist(inputList)</ code >
7+ und der Methode zur Ausgabe einer verketteten Liste < code > printList()</ code > . Eine weitere Methode ist
8+ < code > searchValue(value)</ code > mit deren Hilfe Sie eine Listenelement mit einem bestimmten Wert
9+ suchen können. Ihre Aufgabe ist es, eine Methode < code > insertAfterNode(prevNode, newNode)</ code >
10+ zu implementieren, die ein neues Listenelement < code > newNode</ code > direkt nach dem gegebenen
11+ Element < code > prevNode</ code > einfügt.
12+ </ p >
13+
14+
15+ < h2 id ="aufgabe "> Aufgabe</ h2 >
16+
17+ < p >
18+ Implementieren Sie die Funktion < code > insertAfterNode</ code > in Python.
19+ Die Funktion bekommt das Element < code > prevNode</ code > und das neue Element < code > newNode</ code >
20+ übergeben und soll das neue Element in die Liste einfügen. Ist < code > prevNode</ code > None,
21+ soll eine < code > ValueError</ code > Exception ausgelöst werden.
22+ </ p >
23+
24+
25+ < p >
26+ Erstellen Sie eine Datei mit dem Namen
27+ < code class ="text-danger border border-dark "> linkedAfter.py</ code > und
28+ Implementieren Sie die Funktion < code > insertAfterNode</ code > in Ihrer Datei. Kopieren Sie dazu den
29+ folgenden Codeblock in die Datei < code class ="text-danger border border-dark "> linkedAfter.py</ code > ,
30+ und ergänzen Sie die Methode < code > insertAfterNode</ code > :
31+ </ p >
32+
33+ < div class ="alert alert-dark ">
34+ < pre > < code >
35+ class ListNode:
36+ def __init__(self, value: int):
37+ self.value: int = value
38+ self.next: ListNode | None = None
39+
40+
41+ class LinkedList:
42+ def __init__(self):
43+ self.head = None
44+
45+ def FromPythonlist(self, inputList: list[int]):
46+ for val in inputList:
47+ newNode = ListNode(value=val)
48+ self.insertAfterHead(newNode)
49+
50+ def searchValue(self, value: int) -> ListNode:
51+ current = self.head
52+ while current is not None:
53+ if current.value == value:
54+ return current
55+ current = current.next
56+ return None
57+
58+ def printList(self):
59+ current = self.head
60+ while current is not None:
61+ print(current.value, end=" -> ")
62+ current = current.next
63+ print("None")
64+
65+ def insertAfterHead(self, newNode: ListNode):
66+ newNode.next = self.head
67+ self.head = newNode
68+ </ code > </ pre >
69+ </ div >
70+
71+
72+ <!-- <p></p>
73+ <h2 id="demo">Demo</h2>
74+ <p>
75+ <script async="" data-autoplay="1" data-cols="80" data-loop="1" data-rows="12"
76+ id="asciicast-"
77+ src="https://asciinema.org/a/.js">
78+ </script>
79+ </p> -->
80+
81+ < h2 id ="before-you-begin "> Bevor Sie beginnen</ h2 >
82+ < p > Melden Sie sich bei < a href ="https://cs50.dev/ " target ="_blank "> cs50.dev</ a > an, klicken Sie
83+ auf Ihr Terminal und führen Sie < code
84+ class ="text-danger border border-dark "> cd</ code > ohne Parameter aus. Sie
85+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:</ p >
86+ < div class ="alert alert-primary "> < code
87+ class ="text-dark font-weight-bold "> $</ code > </ div >
88+ < p > Als nächstes führen Sie</ p >
89+ < div class ="alert alert-primary "> < code class ="text-dark font-weight-bold "> mkdir
90+ linkedAfter</ code > </ div >
91+ < p > aus, um einen Ordner namens < code
92+ class ="text-danger border border-dark "> linkedAfter</ code > in Ihrem Codespace
93+ zu erstellen.</ p >
94+ < p > Führen Sie anschließend</ p >
95+ < div class ="alert alert-primary "> < code class ="text-dark font-weight-bold "> cd
96+ linkedAfter</ code > </ div >
97+ < p > aus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
98+ nun < code class ="text-danger border border-dark "> linkedAfter/$</ code > anzeigen.
99+ Jetzt können Sie</ p >
100+ < div class ="alert alert-primary "> < code class ="text-dark font-weight-bold "> code
101+ linkedAfter.py</ code > </ div >
102+ < p > ausführen, um eine Datei namens < code
103+ class ="text-danger "> linkedAfter.py</ code > zu erstellen, in der Sie Ihr
104+ Programm schreiben.
105+ </ p >
106+
107+ < h2 id ="how-to-test "> So testen Sie Ihr Programm</ h2 >
108+ < p > So können Sie Ihr Programm manuell testen:</ p >
109+
110+ < p >
111+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
112+ Erstellen Sie dazu eine Instanz der < code > LinkedList</ code > , fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode < code > insertAfterNode</ code > auf.
113+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie < code > printList()</ code > verwenden.
114+ </ p >
115+
116+ < div class ="alert alert-dark ">
117+ < pre > < code >
118+ # Erstellen einer verketteten Liste aus einer Python-Liste
119+ inputList = [4, 8, 2, 1]
120+ ll = LinkedList()
121+ ll.FromPythonlist(inputList)
122+
123+ print("Liste vorher:")
124+ ll.printList()
125+
126+ node = ll.searchValue(8)
127+ newNode = ListNode(3)
128+ # Einfügen von 3 nach 8
129+ ll.insertAfterNode(node, newNode)
130+
131+ print("Liste nachher:")
132+ ll.printList()
133+ # Erwartete Ausgabe: 1 -> 2 -> 8 -> 3 -> 4 -> None
134+ </ code > </ pre >
135+ </ div >
136+
137+
138+
139+ < p > Sie können das folgende Kommando ausführen, um Ihren Code mit < code
140+ class ="text-danger "> check50</ code > zu überprüfen, einem Programm, das bei
141+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
142+ aber auch selbst!</ p >
143+ < div class ="alert alert-primary "> < code class ="text-dark font-weight-bold ">
144+ check50 HSDDigitalLabor/problems/adg2025/linkedAfter
145+ </ code > </ div >
146+ < p >
147+ Grüne Smileys < span style ="font-family: monospace; color: green; "> :) </ span >
148+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
149+ traurige Smileys < span style ="font-family: monospace; color: red; "> :( </ span >
150+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
151+ hat. Besuchen Sie die URL, die < code class ="text-danger "> check50</ code >
152+ ausgibt, um zu sehen, welche Eingabe < code class ="text-danger "> check50</ code >
153+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
154+ Ausgabe Ihr Programm tatsächlich geliefert hat.
155+ </ p >
156+
157+ < h2 id ="how-to-submit "> Abgabe</ h2 >
158+ < p > Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen.
159+ </ p >
160+ < div class ="alert alert-primary "> < code class ="text-dark font-weight-bold ">
161+ submit50 HSDDigitalLabor/problems/adg2025/linkedAfter
162+ </ code > </ div >
163+ < p >
164+ Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung
165+ nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird
166+ die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der
167+ Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch
168+ nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben
169+ werden, eine Abgabe in Moodle ist nicht möglich.
170+ </ p >
171+
172+ < h2 id ="how-to-mark "> Markierung der Aufgabe als erledigt</ h2 >
173+ < p > Nach dem Einreichen der Lösung mit < code class ="text-danger "> submit50</ code > ,
174+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
175+ < button type ="submit " class ="btn btn-primary " id ="sample_solution " disabled >
176+ Aufgabenlösung hinzufügen</ button >
177+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
178+ "Texteingabe online" den folgenden Text ein:
179+ </ p >
180+ < div class ="alert alert-primary ">
181+ < code class ="text-dark font-weight-bold "> Mit submit50 abgegeben.</ code >
182+ </ div >
183+ < p > Schließen Sie die Eingabe durch Klick auf den Button
184+ < button type ="submit " class ="btn btn-primary " id ="sample_save " disabled >
185+ Änderungen speichern</ button > unterhalb des Textfeldes ab.
186+ </ p >
187+ < p >
188+ Zur besseren Übersicht markieren Sie das Problem linkedAfter.py in Moodle als erledigt,
189+ indem Sie ganz oben auf dieser Seite den Button
190+ </ p >
191+ < p >
192+ < button class ="btn btn-outline-secondary btn-sm text-nowrap " title ="Problem: linkedAfter.py als erledigt kennzeichnen "
193+ aria-label ="Problem: linkedAfter.py als erledigt kennzeichnen " disabled >
194+ Als erledigt kennzeichnen
195+ </ button >
196+ klicken. Daraufhin erscheint der Button
197+ < button class ="btn btn-success btn-sm text-nowrap "
198+ title ="Problem: linkedAfter.py ist als erledigt gekennzeichnet. Zum Rückgängigmachen klicken. "
199+ aria-label ="Problem: linkedAfter.py ist als erledigt gekennzeichnet. Zum Rückgängigmachen klicken. " disabled >
200+ < i class ="fa fa-check " aria-hidden ="true "> </ i > Erledigt
201+ </ button >
202+ </ p >
203+
204+ < p class ="text-muted text-right text-nowrap " style ="font-size: 0.6em; "> generated 2025-12-19 19:13:17</ p >
0 commit comments