Listen in Java. Anehängter Code nicht ganz klar

Status
Nicht offen für weitere Antworten.
C

Christian_1986

Gast
Hallo zusammen, ich habe eine Frage zu Listen in Java.
Ich habe hier einen Code, mit dem man Listen erstellen kann.
Ein Beispiel ist in der Main funktion.
Man macht eine neue Liste mit

ConsList l = new ConsList();

und kann dann Sachen einfügen z.B:

l.insert("Hallo")
l.insert("DU!!!")

und dann die liste mit

print(l) ausgeben.

Wie gesagt in der main Funktion sind dazu Beispiele.

Ich verstehe die Methode insert nicht.
Dort wird erst eine neue Zelle angelegt, mit dem Inhalt, den man
übergibt.
Cons cons = new Cons(obj);

Dann wird diese Zelle auf head zeigen. Also prinzipiell zeigt dann jede
Zelle auf Head.

Head aber wird im nächsten Schrit gleich cons gesetzt.
Da alle Zellen auf head zeigen, head gleich cons gesetzt wird und cons
der Inhalt der letzten Zelle ist, heißt das doch alle Zellen zeigen auf
die letzte.
Aber wo ist da der Sinn? Das kann doch so garnicht verstanden werden!?

Es wäre schön, wenn ihr mir helfen könntet ;)
Danke




Code:
 public class Cons 
{
  public Object obj; // das Objekt in dieser Zelle
  public Cons next;  // Verweis auf die naechste Zelle
  public Cons(Object obj) {
    this.obj = obj;
    next = null;
  }
}

public class ConsList
{
  private Cons head, foot; // Kopf und Fuss der Liste
  public ConsList() { head = foot = null; /* neue leere Liste */ }
  public boolean contains(Object obj) { return contains(head, obj); }
  protected boolean contains(Cons cons, Object obj) {
    if (cons == null) return false;
    else if (cons.obj == obj) return true;
    else return contains(cons.next, obj);
  }
  public void print() {
    System.out.print("Liste [");
    print(head);         // rekursive Ausgabe der Cons-Zellen
    System.out.println("]");
  }
  protected void print(Cons cons) {
    if (cons == null) return ;  // letzte Zelle erreicht
    System.out.print(cons.obj); // Objekt ausgeben
    if (cons.next != null) {
      System.out.print(", ");
      print(cons.next);       // Rekursiv weiter 
    }
  }
  public void insert(Object obj) {
    Cons cons = new Cons(obj);  // neue Cons-Zelle
    cons.next = head;      // vorne anfuegen..
    head = cons;        // .. und Kopf der Liste anpassen
    if (foot == null) foot = cons; // eventuell auch den Fuss
  }
  public void append(Object obj) {
    Cons cons = new Cons(obj);  // neue Cons-Zelle
    if (foot == null) head = foot = cons; // genau eine Cons-Zelle
    else { // hinten anfuegen und Fuss anpassen
      foot.next = cons;
      foot = cons;
    }
  }
  public void remove(Object obj) {
    if (head == null) return ;
    if (head.obj == obj) {
      if (head == foot) foot = head = null;
      else head = head.next;  // erste Cons-Zelle entfernen
    } else remove(head, head.next, obj);
  }
  protected void remove(Cons prev, Cons cons, Object obj) {
    if (cons == null) return ;
    if (cons.obj == obj) {
      // vorherige Cons-Zelle auf Nachfolgende zeigen lassen,
      // somit faellt 'cons' aus der Liste
      prev.next = cons.next;
      if (foot == cons)     // evtl. Fuss anpassen
        foot = prev;
    } else remove(cons, cons.next, obj);
  }
  public boolean isEmpty() { return head == null;  }
  public Object removeHead() {
    if (head == null) return null;
    Object res = head.obj;
    if (head == foot) head = foot = null;
    else head = head.next;
    return res;
  }

  public static void main (String ... args) {
    // Kleines Testprogramm fuer Listen:
    ConsList l = new ConsList();
    System.out.println("leer? " + l.isEmpty());
    String s1 = "Hallo", s2 = "Welt";
    l.insert(s1);
    System.out.println("leer? " + l.isEmpty());
    l.print();
    l.insert(s2);
    l.print();
    l.remove(s2);
    l.print();
    l.append(s2);
    l.print();
    l.remove(s2);
    l.remove(s1);
    l.print();
    System.out.println("leer? " + l.isEmpty());
  }
}
 

Leroy42

Top Contributor
Code:
public void insert(Object obj) { 
    Cons cons = new Cons(obj);  // neue Cons-Zelle 
    cons.next = head;      // vorne anfuegen.. 
    head = cons;        // .. und Kopf der Liste anpassen 
    if (foot == null) foot = cons; // eventuell auch den Fuss 
  }

Das Element wird am Anfang der Liste eingefügt:

cons.next = head; // cons's next field verweist auf den bisherigen head
head = cons; // und der head der Liste verweist jetzt auf das neue element

Edit:
Christian_1986 hat gesagt.:
Dann wird diese Zelle auf head zeigen. Also prinzipiell zeigt dann jede
Zelle auf Head.

Nein, nicht jede Zelle, sondern nur die aktuell neue!
 
G

Gast

Gast
Mir ist das leider nicht ganz klar, was ist mit head gemeint? Ich verstehe leider immer noch nicht, wie hier am Anfang der Liste etwas eingefügt wird, wie das funktioniert? Meinst du, du könntest das etwas genauer sagen?
 
G

Gast

Gast
Ich tippe ein:

insert("Hallo")

gehen wir die Zeilen ab:


Cons cons = new Cons(obj);
Die Zelle "Hi "wird erstellt
cons.next = head;
"Hi" zeigt auf head
head = cons;

und head ist = cons, also zeigt "Hi" auf sich selbst ???
 

Leroy42

Top Contributor
listefb1.jpg
 
G

Gast

Gast
Mir ist das noch nicht 100% klar. Was ist das für ein Kreis dadrin?
Nochmal zu eben:


insert("Hallo")

gehen wir die Zeilen ab:


Cons cons = new Cons(obj);
Die Zelle "Hi "wird erstellt. Das ist ja Fakt ;)
cons.next = head;
"Hi" zeigt auf head. Das ist doch auch soweit richtig, die Zeile muss man ja nur lesen ^^

head = cons;

und head ist = cons, also zeigt "Hi" auf sich selbst (Hi zeigt auf head = cons also Hi auf cons, was ja Hi selber ist).

Hmmm irgendwie machts noch nicht Klick ...
 

Leroy42

Top Contributor
Gast hat gesagt.:
Mir ist das noch nicht 100% klar. Was ist das für ein Kreis dadrin?

Der Kreis repräsentiert den null-value: Also das next-field der Zelle ist gleich null

Gast hat gesagt.:
"Hi" zeigt auf head.

Nochmal: Nein!

"Hi" zeigt nicht auf head, sodern bekommt den Wert, den head vorher hatte.

Also beim Einfügen des ersten Wertes ist head == null, somit bekommt das
next-Feld von "Hi" den Wert null zugewiesen.

Bein Einfügen des zweiten Elements, bekommt dessen next-Field den
Wert den head vorher hatte; also zeigt jetzt auch auf das erste Element
und zeigt nicht auf head.

Und danach zeigt head (der Liste) auf dieses neue Element.
 
G

Gast

Gast
Ahhh, ich glaube es ist mir jetzt klar geworden!!! Danke Dir erstmal soweit. Ich spiel damit jetzt noch ein bisschen herum, melde mich dann die Tage nochmal.
Aber echt lieb von dir, hatte irgendwie ein Brett vorm Kopf ;(
Danke!
 

Leroy42

Top Contributor
Das war ja ne richtige Zangengeburt! :shock:

Ich geh dann mal Billiard spielen.

Ähh, meine natürlich Golf! Gehört sich ja für 'nen Arzt! :cool:
 
G

Gast

Gast
Eine kleine Frage noch.
Als erstes: insert("3")
Dann hat 3.next = null
3.obj = 3

weiter:

insert ("4") dann hat
4.next = 3
4.obj = 4

weiter:

insert ("5") dann hat
5.next = 4
5.obj = 3

und das war der letzte durchlauf. hat dann head.next= 5 und head.obj = 5 (head = cons wurde ja gesagt)
?

Beim Ausgeben würde das heißen, die erste Zelle wird 2x ausgegeben. DAs wird sie aber nicht. Wo liegt mein Gedankenfehler?
 
G

Gast

Gast
Eine kleine Frage noch.
Als erstes: insert("3")
Dann hat 3.next = null
3.obj = 3

weiter:

insert ("4") dann hat
4.next = 3
4.obj = 4

weiter:

insert ("5") dann hat
5.next = 4
5.obj = 5

und das war der letzte durchlauf. hat dann head.next= 5 und head.obj = 5 (head = cons wurde ja gesagt)
?

Beim Ausgeben würde das heißen, die erste Zelle wird 2x ausgegeben. DAs wird sie aber nicht. Wo liegt mein Gedankenfehler?
 

Leroy42

Top Contributor
Gast hat gesagt.:
und das war der letzte durchlauf. hat dann head.next= 5 ?

Nein!

head zeigt auf 5 (= "5") und
head.next = "4" (das was head vor dem Einfügen des letzten Elements war)

Aber genau das hast du doch selbst erkannt und ein paar Zeilen zuvor geschrieben:

Code:
5.next = 4 
5.obj = 5

Also, da head jetzt auf "5" zeigt, zeigt head.next == "5.next" == "4"
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Listen in Java aneinanderfügen, subtrahieeren usw. Allgemeine Java-Themen 14
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
F Problem mit Java Listen Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
M doppelt verkettete Listen Allgemeine Java-Themen 2
L Listen Allgemeine Java-Themen 3
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
J Mit Referenzen verkettet Listen. Allgemeine Java-Themen 9
S Intressante Benchmark-Ergebnisse mit Listen. Weiss jemand wie man diese erklaeren kann? Allgemeine Java-Themen 15
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
P Listen sortieren Allgemeine Java-Themen 1
RalleYTN Collections Verständnisfrage zu Objektreferenzen in Listen Allgemeine Java-Themen 5
C Listen Allgemeine Java-Themen 1
M liste von listen anders ausgeben Allgemeine Java-Themen 1
W Sortierte Listen - Methode suchen Allgemeine Java-Themen 17
W Sortierte Listen mit Polymorphismus Allgemeine Java-Themen 6
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
S Permutation und Listen Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
F JAXB / Listen durchlaufen Allgemeine Java-Themen 17
T Drucken von variabel langen Listen (es kommen nur leere Seiten raus) Allgemeine Java-Themen 2
F Vergleich zweier Listen Allgemeine Java-Themen 4
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D variabler Listen name Allgemeine Java-Themen 3
V Drucken von Listen Allgemeine Java-Themen 6
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
M Addieren von Listen Allgemeine Java-Themen 2
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
R Objektsynchronisierung zweier Listen?!?! Allgemeine Java-Themen 2
H Listen Allgemeine Java-Themen 5
G Datenstruktur: LISTEN Allgemeine Java-Themen 7
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
C Problem Methoden, Klassen, Listen Allgemeine Java-Themen 27
K Listen,Bäume,Mengen Allgemeine Java-Themen 3
S Hinzufügen von Elementen zu Listen Allgemeine Java-Themen 4
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
D Listen / Datenstrukturen und ein blutiger Anfänger Allgemeine Java-Themen 7
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
T Problem mit Listen Allgemeine Java-Themen 8
B binarysearch bei listen mit klassen Allgemeine Java-Themen 4
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
L Doppelt Verkettete Listen Allgemeine Java-Themen 6
E Verkettete Listen Allgemeine Java-Themen 5
M objekt mit listen Allgemeine Java-Themen 5
G Domainen crawlen & Domainnamen listen -> LANGSAM! Allgemeine Java-Themen 19
M Listen Problem! Allgemeine Java-Themen 26
M doppelt verkettete Listen? Allgemeine Java-Themen 5
M Serialisierte listen ausgeben? Allgemeine Java-Themen 6
F 2 Varianten für synchronisierten Zugriff auf Listen Allgemeine Java-Themen 2
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
G Synchronisierte Listen. ein Graus Allgemeine Java-Themen 4
M Verknüpfung von Listen Allgemeine Java-Themen 3
S Frage zu ArrayList mit Listen Allgemeine Java-Themen 8
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
D Listen Allgemeine Java-Themen 4
M sortierte listen Allgemeine Java-Themen 5
I Doppelt verkette Listen Allgemeine Java-Themen 2
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben