Einfach verkettete Liste

Status
Nicht offen für weitere Antworten.

deeP

Mitglied
Hallo,
ich bin mehr als nur ein Anfänger. Ich versuche gerade für die kommende Informatik Klausur (Einführung in die Informatik für Ingenieure), einfach verkettete Listen zu verstehen.

Aber ganz ehrlich ich versteh nur Bahnhof. 90 Prozent der Vorlesung habe ich verstanden. Jetzt kommt sowas und ich steh sowas von auf den Schlauch.


Also so viel habe ich in den 2 Stunden jetzt verstanden:

Es gibt ein Kopf das ist das Einzige Element ohne Vorgänger. und ein Null. Das letzte Element in der Kette.

Was ist aber bitte "weiter"?

ich mein zB. habe ich folgenden Methode zum einfügen von Elemente ganz vorne der Kette:

[HIGHLIGHT="Java"]public void einfuegenVorn(int k) {
Element e= new Element(k);
e.weiter=Kopf(k);
Kopf=e;
}[/HIGHLIGHT]
Also ich versuche gerade die Methode zu verstehen aber klappt irgendwie nicht...

Also es wird ein Objekt der klasse Element erzeugt dieses heisst e. Es wird eine Zahl übergeben sagen wir mal die 7.

Was heisst nun die 2. Zeile? e.weiter = kopf(k) ???

Die dritte Zeile bedeutet ja der Kopf zeigt auf das objekt e. Aber die 2. versteh ich überhaupt nicht. Was soll dieses weiter? Und Kopf "in Klammern k" ?

Ich hoffe ihr könnt mir helfen. Für euch ist das Kindergarten aber für mich sehr wichtig wegen Klausur.

Ich hoffe ihr könnt mir helfen

Lieben gruß

deeP
 
Zuletzt bearbeitet von einem Moderator:

fjord

Bekanntes Mitglied
Falls du es noch nicht getan hast, guck dir mal den wiki Artikel zu Listen an.

Einfach gesagt hat jedes Element der Liste, bis auf das letzte, einen Verweis auf seinen Nachfolger. Dieser Verweis ist in deinem Beispiel e.weiter. Wenn du ein neues Element in der Liste vorne einfügst, dann wird das ehemals 1. Element zum 2. Element. Also muss der neue Kopf einen Verweis auf den alten Kopf haben.

Bist du sicher, dass die Zeile
Code:
e.weiter=Kopf(k);
ist? Oder ist es eher
Code:
e.weiter=Kopf
?
 

ARadauer

Top Contributor
das ganze mit papier und bleistift mal auszuprobieren ist sehr hilfreich.

mal dir ein paar Element Knoten auf, Kopf ist der erste, jeder Knoten hat ein weiter das auf den nächsten zeigt...
so jetzt vorne einfügen...
neuen knoten machen ... Element e= new Element(k);
das weiter des neuen knoten auf den akutellen kopf setzen ..e.weiter=Kopf(k);
und kopf muss jetzt auf den neuen knoten zeigen.. Kopf=e;

aufmalen hilft...
 

Marco13

Top Contributor
Aufmalen.... oder basteln :D Wenn man die Referenzen über Bindfäden modelliert, versteht man vielleicht eher, warum man manche Sachen so macht, wie man sie macht: Wenn man die Bindfäden losläßt sind sie weg... :D
 

ARadauer

Top Contributor
cool! basteln... daran hab ich noch gar nie gedacht, das wär mal was für ein gutes video tutorial ;-)
 

deeP

Mitglied
Vielen vielen Dank. Jetzt bin ich schon mal um 100 prozent schlauer. Also

bei mir im Heft steht e.weiter=kopf(k);

vllt habe ich es falsch abgeschrieben und es stand e.weiter=kopf; was für mich auch mehr sinn ergeben würde.

Also ich stelle mir das jetzt so vor ;). Hoert sich lustig an aber naja... Also wir haben den Kopf der zeigt auf Null. Kein Knoten ist vorhanden. Nun rufe ich die Methode einfügenVorn auf: ich erstelle ein neues objekt der Klasse Element sagen wir mal die 7. Der weiterzeiger zeigt auf Kopf also übernimmt das neue Element den weiter Zeiger des Kopfes. Nun ist kann die Kette nicht unterbrochen werden und der Kopf "schwingt sich rüber" und koppelt sich an die 7 .

Also so wie ich das verstanden habe ist Kopf immer das erste Element. Was mir nicht ganz klar ist, ist immer noch diese Zeile. e.weiter=Kopf; Also heisst das, dass der weiter Zeiger den weiter zeiger von Kopf übernimmt, bzw seinen Zeiger übernimmt?


Lieben Gruß

deeP
 

Marco13

Top Contributor
Also ich stelle mir das jetzt so vor ;). Hoert sich lustig an aber naja... Also wir haben den Kopf der zeigt auf Null. Kein Knoten ist vorhanden. Nun rufe ich die Methode einfügenVorn auf: ich erstelle ein neues objekt der Klasse Element sagen wir mal die 7. Der weiterzeiger zeigt auf Kopf also übernimmt das neue Element den weiter Zeiger des Kopfes. Nun ist kann die Kette nicht unterbrochen werden und der Kopf "schwingt sich rüber" und koppelt sich an die 7 .

Hört sich eher kompliziert als lustig an.

Ich will zwar nicht wissen, wie oft dieser Sachverhalt schon aufgezeichnet wurde (von dir vermutlich noch nicht, sonst würdest du nicht mehr nachfragen....) aber... gut
Code:
Ausgangssituation:

             ______      ______
            |  ... |--->|  ... |--->null
            |______|    |______|    
             Kopf






Nach: Element e = new Element(k);

             ______      ______
            |  ... |--->|  ... |--->null
            |______|    |______|    
             Kopf


 ______     
|  k   |--->null
|______|    





Nach e.weiter=Kopf;


 ______      ______      ______
|  k   |--->|  ... |--->|  ... |--->null
|______|    |______|    |______|    
              Kopf




Nach Kopf=e;


 ______      ______      ______
|  k   |--->|  ... |--->|  ... |--->null
|______|    |______|    |______|    
  Kopf


Oder konkret in bezug auf die Frage:
Was mir nicht ganz klar ist, ist immer noch diese Zeile. e.weiter=Kopf; Also heisst das, dass der weiter Zeiger den weiter zeiger von Kopf übernimmt, bzw seinen Zeiger übernimmt?
Nein. Das bewirkt, dass der "weiter"-Zeiger danach auf das Zeigt, was bisher der Kopf war. Wenn VOR dem Kopf etwas eingefügt wird, ist das, was HINTER diesem Element kommt....? Der Kopf, ja. Danach muss man mit
Kopf=e;
noch sagen, dass nas neueste (vorderste) Element in Zukunft der Kopf sein soll.


Zur Auflockerung nochmal die Tragödie der verketteten Listen:
linkedlists-thumb.jpg
 

Leroy42

Top Contributor
Was mir nicht ganz klar ist, ist immer noch diese Zeile. e.weiter=Kopf; Also heisst das, dass der weiter Zeiger den weiter zeiger von Kopf übernimmt, bzw seinen Zeiger übernimmt?

Kopf ist ja am Anfang (also vor dem 1. Einfügen) NULL; dieser Wert (NULL) wird
jetzt dem weiter-Zeiger des neuen Elements zugewiesen.

Mit Kopf = e wird nun das neue Element zum Kopf.

Beim erneuten Einfügen bewirkt e.weiter=Kopf, daß e.weiter hier auf das
soeben eingefügte Element verweist (also dem neuen Kopf)....
 

Leroy42

Top Contributor
@Marco13

Ich war jetzt zwar zu langsam, aber dafür habe ich
das nicht so schön aufgezeichnet wie du! :cool:
 

deeP

Mitglied
Gut danke sehr.

Noch eine Frage ;):

Die Augangssituation wenn ich kein Element in der Liste habe ist doch so:


----
|Kopf | ---->|Null| . Nun einfügenVorn(7);
----

|7| -> |Kopf| - > |Null| . (e.weiter=Kopf) , Nun Kopf=e;

| 7 | -------> | | -----> Null.Jetzt meine Frage was steht im Mittleren Knoten
| Kopf | ? Für Kopf wurde doch kein Wert gespeichert?
Ist dieser Knoten leer?

Ps: Ich hoffe ich strapazier euch nicht zu sehr... :eek:

Lieben Gruß

deeP


Also letzte gezeichnete Zeile soll heissen 7 ist der Kopf. Keine Ahnung warum der das so komisch darstellt bei mir im edit menü sah es anders aus
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Wieso? Im Kopf bleibt einfach nur das stehen, was da vorher schon war.
Initialisieren sollte man das wohl mit null. Wenn man dann zB. elemente 1,2,3 einfügt sieht es dann so aus:

Initialisiert: Kopf=null
1 Hinzufügen: Kopf=1->null
2 Hinzufpgen: Kopf=2->1->null
3 Hinzufügen: Kopf=3->2->1->null

und so weiter...

Diese Implementierung finde ich eh unschön und unpraktisch. Es ist viel besser, wenn man den Kopf als ein Dummy-Element ganz vorne abspeichert, dann hat man weniger stress beim iterieren, braucht keine Fallunterscheidungen und sowas. Dann hat man im Kopf eben einfach immer "irgendwas" (sagen wir mal so ein unbestimtes #-dings), was aber nie gebraucht wird, dann sieht's nämlich so aus:

Initialisiert: #->null
1 Hinzufügen: #->1->null
2 Hinzufügen: #->2->1->null
3 Hinzufügen: #->3->2->1->null

dann braucht man sich zB bei solchen sachen wie hasNext() und next() keine Sorgen über die spezialfälle zu machen. Aber das war jetzt wohl eher verwirrend? Also, mit bleistiften zeichnen & selbst implementieren ist eine ziemlich gute Idee.
 

deeP

Mitglied
Danke euch.

Ich bin jetzt einigermaßen weiter gekommen und habe die Aufgabe eine Methode anzahl zu erstellen, die die Anzahl der Elemente der liste zurück gibt.Falls sie leer ist, so soll ich false returnen wenn nicht die anzahl.

Ich habe mir folgendes überlegt:

[HIGHLIGHT="Java"]public int anzahl() {
int n=0;
if(Kopf!=null) {
int n=1;
while(e.weiter!=null) {
n++;
e=e.weiter;
}
return n;
}
else {
return n;
}
}[/HIGHLIGHT]
was meint ihr klappt das?

Lieben gruß



Ergänzung ah ich glaube ich habe einen fehler gemacht und zwar muss er ja wissen wo er anfäng deswegen muss ich glaube ich noch

e=Kopf setzen oder?
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
Falls sie leer ist, so soll ich false returnen wenn nicht die anzahl.
Äääääh? Hast du selbst verstanden, was du da eben gesagt hast? Ich hab's jedenfalls nicht verstanden. 0 ist imho auch eine recht schöne ganze Zahl.

Ich habe mir folgendes überlegt:
Code:
public int anzahl() {
   int n=0;
   if(Kopf!=null) {
       int n=1;
       while(e.weiter!=null) {
         n++;
         e=e.weiter;
       }
     return n;
    }
    else { 
      return n;
    }
}
was meint ihr klappt das?
Joah, sieht im prinzip ganz gut aus, allerdings ist das eine ziemlich lahme Lösung, weil du ja jedes mal die gesamte liste durchlaufen musst, bei einer Liste mit 123131323123 einträgen dauert das dann erstmal zwei Tage...
Normalerweise wird einfach eine member-variable "size" angelegt, die anfangs mit 0 initialisiert wird, und jedes mal wenn was hinzugefügt wird, inkrementiert man die variable, wenn etwas gelöscht wird, macht man sie wieder kleiner. Dann brauchst du bei dieser methode nur diese zahl zurückzugeben, das geschieht sofort mit konstanten Aufwand.
 

deeP

Mitglied
klar nicht return n, sondern return false meine ich natürlich.

Ja ich glaube für uns ingenieure reicht das ;). size hatten wir auch gar nicht :eek:.

Musste ich eigentlich noch e=Kopf; setzen. damit er weiß, wo er anfangen soll?


lg
 

Marco13

Top Contributor
Ich glaube es ging gerade darum, sich so durch diese Liste zu hangeln - Effizienz hin oder her.

Aus rein akademischen Gründen noch die rekursive Variante:
Code:
int anzahl()
{ 
    return anzahl(kopf);
}

private int anzahl(Knoten k)
{
    if (k==null) return 0;
    return 1+anzahl(k.weiter);
}
 

deeP

Mitglied
was soll da denn falsch sein? Die Liste ist leer --> also returne ich false. wenn nicht returne ich das n aus der schleife oder bin ich total durch den wind?
 

0x7F800000

Top Contributor
okay, na dann leg los. Wenn du Integer und Booleans zu irgendeinem sinnvollen Typ gewrappt hast, und dir außerdem irgendeine halbwegs plausible Begründung für diese sinnfreie Vorgehensweise überlegt hast, kannst du hier gerne mal die methode posten, ich will auch mal sehen, wie man eine size()-methode einer collection auf 500 Zeilen Code verteilen kann^^ :eek:
 

deeP

Mitglied
ok stimmt ;) ist ja ein boolean und kein int :p ,:D. Mein Kopf ist schon total durch einander brauche mal ne pause
 

deeP

Mitglied
Hallo Leute,
ich habe mache gerade noch eine Aufgabe und zwar soll follgende Methode schreiben:

"letztesElement" , diese gibt das letzte Element der Liste zurück. Es soll NICHT der Wert sondern die Referenz auf das Element zurückgegeben werden. Ist die Liste leer, so wird null zurückgegeben.

Jetzt meine Frage. Wie soll ich das denn machen, dass eine Referenz zurück gegeben wird?


ich mein sonst war es ja so :

public int/double xY() gibt wert zurück
public boolean xY() gib boolean zurück usw

wie geht das nun mit der Referenz?


lieben Gruß
 

deeP

Mitglied
ok ich glaube ich habe es verstanden einfach den Klassen namen vor den Methoden namen. Ich versuchs mal:

[HIGHLIGHT="Java"]public Element letztesElement() {
if(Kopf!=null) {
Element e=Kopf;
while(e.weiter!=null) {
e=e.weiter;
}
return e;
}

}[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
C einfach verkettete Liste -> Elemente vertauschen Java Basics - Anfänger-Themen 2
R einfach verkettete Liste, intersect Java Basics - Anfänger-Themen 4
E einfach verkettete liste, nullPointerException Java Basics - Anfänger-Themen 5
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
N Erste Schritte HelloWorld möchte einfach nicht laufen Java Basics - Anfänger-Themen 11
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
Hanschyo Programm schließt sich einfach Java Basics - Anfänger-Themen 2
S Einfach verkette Liste Java Basics - Anfänger-Themen 27
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
C Methoden Einfach verkette Liste - int Werte aufsteigend sortieren Java Basics - Anfänger-Themen 1
V Codezeile wird einfach nicht ausgeführt Java Basics - Anfänger-Themen 23
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
N Einfacher Rechner (für mich nicht so einfach) Java Basics - Anfänger-Themen 5
M Array in ein Array übertragen (möglichst einfach) Java Basics - Anfänger-Themen 6
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
R Methoden... ich vesteh sie einfach nicht Java Basics - Anfänger-Themen 15
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
C Erste Schritte Problem mit der Division von Koeffizienten... oder einfach nur irgendwlechen zahlen Java Basics - Anfänger-Themen 10
D Klassen Klassen, Objekte, Konstruktor - einfach erklärt Java Basics - Anfänger-Themen 12
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
T Elemente im Vector werden einfach überschrieben! Java Basics - Anfänger-Themen 3
S ich begreife es einfach nicht -> zweck der Schnittstellen Java Basics - Anfänger-Themen 27
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
W Java-Programm als Icon mit Doppelklick einfach öffnen ? Java Basics - Anfänger-Themen 3
M Layout einfach bilden Java Basics - Anfänger-Themen 4
I Weiß einfach nicht mehr weiter... Java Basics - Anfänger-Themen 3
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
A If-Schleife spinnt - ganz einfach Code - Riesen Problem :) Java Basics - Anfänger-Themen 9
Luk10 einfach animation Java Basics - Anfänger-Themen 2
E JMC - Dlls einbinden - möglichst einfach Java Basics - Anfänger-Themen 8
I einfach verkette Liste Java Basics - Anfänger-Themen 9
H Typumwandlung String --> Int (ganz einfach) Java Basics - Anfänger-Themen 9
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
M jar-Datei einfach umbenennen? Java Basics - Anfänger-Themen 8
S Filewriter schreibt einfach nicht Java Basics - Anfänger-Themen 6
G Opjektorientierte Programmierung (OOP). einfach für euch Java Basics - Anfänger-Themen 4
X WAV conversion ist einfach nicht möglich Java Basics - Anfänger-Themen 2
J jar erstellen. Es klappt einfach nicht Java Basics - Anfänger-Themen 14
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
P einfach frage zur vererbung Java Basics - Anfänger-Themen 9
G Frank A. - ports einfach öffnen und schließen Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
L while wird einfach übersprungen? Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
B Packages einfach kopieren? Java Basics - Anfänger-Themen 13
N Mein Applet findet -online- einfach die Klasse nicht ! Java Basics - Anfänger-Themen 6
S Java rundet einfach auf 0 Java Basics - Anfänger-Themen 2
L Ein Bild auf ein JFrame legen. nicht so einfach? =( Java Basics - Anfänger-Themen 11
M Tablelayout einbinden - ich schaff's einfach nicht Java Basics - Anfänger-Themen 16
D Button Text will einfach nicht erscheinen Java Basics - Anfänger-Themen 6
M Methoden. ich versteh das einfach nicht! Bitte helfen! Java Basics - Anfänger-Themen 4
H Kann man in Java einfach einen Beep erzeugen Java Basics - Anfänger-Themen 2
C einfach aber komisch Java Basics - Anfänger-Themen 5
P Restart Button für einfach Applikation Java Basics - Anfänger-Themen 7
H RAF geht einfach nicht Java Basics - Anfänger-Themen 12
D RegEx Probleme - wahrscheinlich zu einfach. Java Basics - Anfänger-Themen 2
H Einfach Datenübergabe Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
V Teil eines Programms funktioniert einfach nicht Java Basics - Anfänger-Themen 2
V If Schleife wird beim ausführen einfach ignoriert Java Basics - Anfänger-Themen 4
D Einfach Leerzeile einfügen ? Java Basics - Anfänger-Themen 2
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
B Applet geht einfach nicht Java Basics - Anfänger-Themen 16
S UIManager kann einfach nicht aufgelöst werden Java Basics - Anfänger-Themen 4
R Einfach if-Abfrage Java Basics - Anfänger-Themen 7
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
A Einfach, gut erklärte Übungen!!! Java Basics - Anfänger-Themen 3
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben