Forum: PC-Programmierung Doppelt verkettete Listen


von java (Gast)


Lesenswert?

Hallo,



ich soll in Java eine doppelt verkettete Liste erstellen und weiß nicht 
recht wie.



Ich stelle mal den vorhandenen Code ein:


1
public class Aufgabe10 {
2
3
4
5
  public static void main(String[] args)
6
7
    {
8
9
    //System.out.println("hello");
10
11
    Natset liste = new Natset();
12
13
    
14
15
    
16
17
    }
18
19
  
20
21
  
22
23
}
24
25
26
27
public class MyNode {
28
29
30
31
  private int value;
32
33
  private MyNode next;
34
35
  private MyNode previous;
36
37
  
38
39
  
40
41
  public MyNode()
42
43
  {}
44
45
  
46
47
  public int getValue()
48
49
  {
50
51
    return value;
52
53
  }
54
55
  
56
57
  public void setValue(int m)
58
59
  {
60
61
    value = m;
62
63
  }
64
65
  
66
67
  public MyNode getNext()
68
69
  {
70
71
    return next;  
72
73
  }
74
75
  
76
77
  public MyNode getPrevious()
78
79
  {
80
81
    return previous;  
82
83
  }
84
85
  
86
87
}
88
89
90
91
92
93
94
95
public class Natset {
96
97
98
99
  private MyNode start;
100
101
  private int size;
102
103
  
104
105
  public Natset(){}
106
107
  
108
109
  public int getSize()
110
111
  {
112
113
    return size;
114
115
  }  
116
117
  
118
119
120
121
}





Ein Teil war bereits vorgegeben, und ich soll es "fertigstellen".



Ein bisschen was habe ich schon gemacht, aber es reicht nicht um 
weiterzukommen.



Erstmal habe ich gedacht, ich erzeuge ein neues Objekt liste, das muss 
ich ja.

Jetzt stellt sich mir die Frage, wie weiße ich start seinen Wert zu? 
Erzeuge ich da einfach ein neues Objekt aus MyNode? Und wie erzeuge ich 
dann neue Listeneinträge? Ich muss von einem Vorhandenen Listeneintrag 
auf den neuen Zeigen. In C habe ich das schon erfolgreich mit Pointern 
Programmiert, aber diese Objektorientierung macht mir ziemlich zu 
schaffen.



Wäre nett wenn mir jemand einen kleinen Hinweiß geben könnte, damit ich 
weiter dran arbeiten kann.



Danke schonmal

von ozo (Gast)


Lesenswert?

Das Objekt, welches ein Element der Liste repräsentieren soll, benötigt 
zusätzlich noch eine Referenz auf seinen Vorgänger und seinen 
Nachfolger.
In dem Objekt, welches die Liste als Ganzes darstellen soll, nimmt man 
sinnigerweise eine Referenz auf das erste und letzte Element mit auf.
Nennen wir sie mal 'Kopf' und 'Arsch'. Zunächst ist Kopf=Arsch=null und 
die Liste damit leer. Bist du so weit?

von Karl H. (kbuchegg)


Lesenswert?

java schrieb:

> Jetzt stellt sich mir die Frage, wie weiße ich start seinen Wert zu?

einfach ein neues MyNode Objekt mit new erzeugen und zuweisen

> Erzeuge ich da einfach ein neues Objekt aus MyNode? Und wie erzeuge ich
> dann neue Listeneinträge?


    vorhandenerKnoten.next = new MyNode

> auf den neuen Zeigen. In C habe ich das schon erfolgreich mit Pointern
> Programmiert,

na dann.
Funktioniert doch in Java auch nicht anders, nur dass es keine Pointer 
Syntax gibt und du Pointer zuweist, in dem du stattdessen die Objekte 
rumreichst und Java unter der Hand nur Pointer umkopiert.

> aber diese Objektorientierung macht mir ziemlich zu
> schaffen.

Das heist in deinem Fall nichts anderes als das eine Funktion "anhängen" 
nichts anderes als eine Funktion des Objektes ist und nicht einfach eine 
freistehende Funktion. Aber mehr ist das nicht.
Einfach 'Beamtendenken" einsetzen: Wer ist dafür zuständig, dass eine 
Operation gemacht wird.
Nicht die Liste ist in letzter Konsequenz dafür zuständig, dass an das 
Ende der List ein neuer Knoten angehängt wird und macht sich die Finger 
schmutzig. Die Liste identifiziert wer der letzte Knoten ist und 
beauftragt dann diesen Knoten den neuen Knoten an sich drann zu hängen. 
Das ist sein Job, da soll sich mal der Knoten die Finger damit schmutzig 
machen.

von java (Gast)


Lesenswert?

Soweit bin ich, dass die Liste leer ist.


Jetzt ist eher meine Frage, wie bekomme ich ein neues Objekt da hinein. 
Und wie greife ich darauf zu, über start? Wie soll das gehen, ich steh 
ziemlich auf dem Schlauch

von Karl H. (kbuchegg)


Lesenswert?

java schrieb:
> Soweit bin ich, dass die Liste leer ist.
>
>
> Jetzt ist eher meine Frage, wie bekomme ich ein neues Objekt da hinein.

indem du es erzeugst.

die Liste hat eine Referenz, die nennt sich start

also wird der erste Knoten erzeugt mittels

    start = new MyNode;

ferig.

> Und wie greife ich darauf zu, über start?

ja.

> Wie soll das gehen,

Indem du einfach das Objekt (über seine Referenz) benutzt

    start.getValue();

> ich steh
> ziemlich auf dem Schlauch

du denkst viel zu komplizert.

von ozo (Gast)


Lesenswert?

Nun ja, dein Objekt 'Liste' könnte doch unter Umständen eine Methode a 
la 'addToHead(Node N)' besitzen. Von außen dann etwa so aufzurufen:
myList = new List();
myList.addToHead(new ListItem());

Klemmts im Detail oder in der Übersicht?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

java schrieb:
> Jetzt ist eher meine Frage, wie bekomme ich ein neues Objekt da hinein.
> Und wie greife ich darauf zu, über start?

http://openbook.galileocomputing.de/javainsel/

von java (Gast)


Lesenswert?

Hi,

in der Übersicht klemmt es, das was Karl Heinz gesagt hat bringt mich 
schon weiter, ich habe echt zu kompliziert gedacht.

und wenn ich jetzt den nächsten eintrag machen will, mache ich dann
start.next = new MyNode(); oder?

Danke

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

java schrieb:
> und wenn ich jetzt den nächsten eintrag machen will, mache ich dann
> start.next = new MyNode(); oder?

Nein... Du benötigst eine append/prepend Funktion da auf private 
Elemente nicht jeder zugreifen kann bzw. soll!

Überleg dir doch erst ohne Java prinzipiell wie es ablaufen soll. Und 
in der Aufgabe steht bestimmt auch drinn welche Operationen zu 
implementieren sind...

von Karl H. (kbuchegg)


Lesenswert?

java schrieb:
> Hi,
>
> in der Übersicht klemmt es, das was Karl Heinz gesagt hat bringt mich
> schon weiter, ich habe echt zu kompliziert gedacht.
>
> und wenn ich jetzt den nächsten eintrag machen will, mache ich dann
> start.next = new MyNode(); oder?

IM Prinzip ja.

Aber du machst es nicht so. Du machst es objektorientiert.

Du gibst dem Knoten start den Auftrag einen neuen Knoten an sich hinten 
drann zu hängen. Denn der Liste ist das schnurzegel, wie das genau geht. 
Das geht die Liste nichts an sondern das ist das Bier vom Knoten

   start.append( new MyNode() );

und die append Methode der Klasse MyNode (weil start ja eine Referenz 
auf ein MyNode Objekt ist) macht dann erst den Klimbim mit den 
'Pointern'.
1
public class MyNode {
2
3
  ...
4
5
  public void append( MyNode newNode )
6
  {
7
    if( this.next() != null ) {
8
      newNode.next( this.next() );
9
      this.next().previous( newNode );
10
    }
11
    this.next( newNode );
12
    newNode.previous( this );
13
  }
14
15
  ...

von java (Gast)


Lesenswert?

Ahh sonst würde ich das ins unendliche verschachteln.

Gut ich brobiere es jetzt so, ist ziemliches Neuland für mich, aber 
danke soweit schonmal.

von Karl H. (kbuchegg)


Lesenswert?

Eines noch.

Du machst natürlich nicht

   start.append( new MyNode() );

Die Liste soll sich den neuen Knoten nicht selbst erzeugen, sondern den 
kriegt sie wiederrum von main. Dort wird der Knoten erzeugt und an eine 
append Methode der Liste weitergegeben, die ihn an die Liste anhängt, 
indem sie den letzten Knoten der Liste beauftragt, den Knoten 
anzuhängen. Natürlich nur wenn es schon einen letzten Knoten gab. Wenn 
nicht, dann ist der übergebene Knoten der neue letzte Knoten (und auch 
erster Knoten klarerweise, denn die Liste muss dann leer gewesen sein, 
wenn es keinen letzten Knoten gab)
1
public class Natset {
2
3
  private MyNode first;
4
  privtae MyNode last;
5
6
  public void append( MyNode newNode )
7
  {
8
    if( this.last == null )
9
      this.first = newNode;
10
    else
11
      this.last.append( newNode );
12
13
    this.last = newNode;
14
  }
15
}

und den Member Variable size schmeisst du am besten gleich wieder raus. 
Wenn jemand wissen will, wieviele Elemente in der List sind, dann zählst 
du die Knoten.

von java (Gast)


Lesenswert?

Also ich habs mal selber nochmal versucht und habe es zwar "geschafft" 
aber ich habe hier glaube ich zwei Variablen, die ich mir irgendwie 
schenken könnte, ich weiß nur noch nicht wie. Ich lasse im Moment Natset 
die Listenverwaltung machen, was ich für sinnvoll halte:

Hier mal der derzeitige Code:
1
public class Aufgabe10 {
2
3
  public static void main(String[] args)
4
    {
5
    //System.out.println("hello");
6
    
7
    //Neue Liste erzeugen
8
    Natset liste = new Natset();
9
    
10
    //Startpunkt erstellen
11
    liste.setStart();
12
    
13
    //Listenelemente hinzufügen
14
    liste.append(1);
15
    liste.append(2);
16
    liste.append(3);
17
    liste.append(4);
18
    liste.append(5);
19
    
20
    //in Liste auf und abgehen und Elemente ausgeben
21
    System.out.println(liste.nextItem());
22
    System.out.println(liste.nextItem());
23
    System.out.println(liste.nextItem());
24
    System.out.println(liste.nextItem());
25
    System.out.println(liste.nextItem());
26
    System.out.println(liste.nextItem());
27
    
28
    System.out.println(liste.previousItem());
29
    
30
    
31
    
32
    }
33
  
34
  
35
  
36
  
37
  
38
  
39
}
40
41
42
public class Natset {
43
44
  private MyNode start;
45
  private MyNode last;
46
  private MyNode address;
47
  private MyNode buffer;
48
  private int size;
49
  
50
  public Natset(){}
51
  
52
  public void setStart()
53
  {
54
    //Start festlegen
55
    start = new MyNode();  
56
    last = start;
57
    address = start;    
58
  }
59
  
60
  public void append(int a)
61
  {
62
    //next auf neu erzeugtes Element zeigen lassen
63
    last.setNext(new MyNode());
64
    //Reverenz auf altes Element speichern
65
    buffer = last;
66
    //letzer Wert
67
    last = last.getNext();
68
    //Reverenzen und Werte setzen
69
    last.setNext(null);
70
    last.setPrevious(buffer);
71
    last.setValue(a);
72
    size++;
73
  }
74
  
75
  public int nextItem()
76
  {
77
    //Wenn es ein nächstes Element gibt
78
    if(address.getNext() != null)
79
    {
80
      //Ein Element weiter springen
81
      address = address.getNext();    
82
      return address.getValue();
83
    }
84
    else
85
    {
86
      return 0;
87
    }
88
    
89
  }
90
  
91
  public int previousItem()
92
  {
93
    if(address.getPrevious() != null)
94
    {
95
      //Ein Element zurückspringen
96
      address = address.getPrevious();    
97
      return address.getValue();
98
    }
99
    else
100
    {
101
      return 0;
102
    }
103
    
104
  }
105
  
106
    
107
  
108
  public int getSize()
109
  {
110
    return size;
111
  }  
112
  
113
}
114
115
public class MyNode {
116
117
  private int value;
118
  private MyNode next;
119
  private MyNode previous;
120
  
121
  
122
  public MyNode()
123
  {}
124
  
125
  
126
  public int getValue()
127
  {
128
    return value;
129
  }
130
  
131
  public void setValue(int m)
132
  {
133
    value = m;
134
  }
135
  
136
  public MyNode getNext()
137
  {
138
    return next;  
139
  }
140
  
141
  public MyNode getPrevious()
142
  {
143
    return previous;  
144
  }
145
  public void setNext(MyNode n)
146
  {
147
    next = n;
148
  }
149
  
150
  public void setPrevious(MyNode p)
151
  {
152
    previous = p;
153
  }
154
155
  
156
}



Wäre nett wenn nochmal jemand drüber schauen würde und mir noch ein paar 
Tipps gibt.


Danke euch soweit schonmal :)

von java (Gast)


Lesenswert?

@Karl Heinz,

mit dem was du mir gepostet hast bin ich übrigends auf keinen grünen 
Zweig gekommen, ich habe es nicht so recht verstanden.

von Purzel H. (hacky)


Lesenswert?

Also, eine doppeltverkettete Liste sollte man aufm Papier aufmalen und 
in irgendeiner Sprache hinschreiben koennen. Im Schlaf. Das ist Teil des 
Eintrittstickets in den Beruf. Zum Glueck gibt's Debugger, da kann man 
Singlesteppen bis die Ohren wackeln. Sinnvoll zur Liste ist auch noch 
eine Membervariable 'count' die die Anzahl Elemente zaehlt.
Mach mal.

von java (Gast)


Lesenswert?

Sorry, dass ich sowas erst jetzt in meinem Studium versuche lerne, aber 
woher soll ich sowas können? Ich versuche mich gerade darin und verstehe 
deinen Kommentar nicht. Wenn du es kannst, dann hilf mir dabei.
Außerdem zähle ich die Anzahl der Elemente.

von Purzel H. (hacky)


Lesenswert?

Also. Mach's mal auf dem Papier. Welche Pointer muessen wohin zeigen. 
Und werden in welcher Reihenfolge wohin verschoben ?

Die Liste hat die Membervariablen : Erster & Letzter und beide zeigen 
auf Knoten.
Die Knoten haben die Membervariablen : Vorheriger & Naechster, und 
zeigen auf Knoten.
Mal das mal auf Papier.
Wie wird der erste, zweite & N-te Knoten angefuegt ?
Wie wird der n-te, zweitletzte & letzte Knoten geloescht ?

Mal das mal auf.

von java (Gast)


Lesenswert?

Das habe ich bereits aufgemalt, aber hast du eigentlich meinen Code 
gelesen?
Er funktioniert schon, nur frage ich mich, ob es ohne die Variablen 
Buffer und address geht.

Danke

von Karl H. (kbuchegg)


Lesenswert?

java schrieb:
> Das habe ich bereits aufgemalt, aber hast du eigentlich meinen Code
> gelesen?
> Er funktioniert schon, nur frage ich mich, ob es ohne die Variablen
> Buffer und address geht.

natürlich


kein Mensch sagt, dass alle Variablen Member einer Klasse sein müssen. 
Man kann wie in jeder Programmiersprache, auch in Java funktionslokale 
Variablen anlegen

Aber Milli hat schon recht: Zum Einfügen braucht man die eigentlich 
nicht. Mal dir auf dem Papier 2 Knoten auf, die korrekt verpointert 
sind. Jetzt kommt ein 3.ter Knoten dazu und wird angehängt. In welcher 
Reihenfolge musst du welchen Pointer wohin zeigen lassen, damit sich das 
alles ausgeht und du keinen Hilfspointer brauchst? Da muss man dann eben 
ein wenig rumprobieren.

Soweit zu "buffer"

Deine "address", bzw. die Funktionen nextItem und previousItem, sind 
genau in der Art gemacht, wie man es nicht macht. Aber keine Angst, du 
bist da in guter Gesellschaft. Ich hab auch schon erfahrene 
Programmierer gesehen, die es genau so gemacht haben und das Kopfkratzen 
war dann groß wie man wohl gleichzeitig unabhängig voneinander 2 
Iterationen durch die Liste macht.
Teil des Problems ist es, dass du die Warnung objektorientiert zu 
programmierern über Bord geschmissen hast. Es ist nicht Aufgabe der 
LIste den Nachfolger eines Knotens festzustellen, sondern das macht der 
Knoten gefälligst selber. Deine address Variable muss da raus. Der 
Verwender der Liste muss das selber verwalten. d.h. er befragt die 
Liste: welches ist dein erster Knoten? Und dann befragt er den Knoten 
selber: Welches ist dein Nachfolger. SOlange, bis ein Knoten kommt, der 
von sich sagt: Ich hab keinen Nachfolger mehr.
Der Verwender in main befragt also nicht die Liste mittels "Ich brauche 
den Nachfolger", sondern er befragt die Liste mittels "Ich brauche den 
Nachfolger VON"

von Karl H. (kbuchegg)


Lesenswert?

java schrieb:
> @Karl Heinz,
>
> mit dem was du mir gepostet hast bin ich übrigends auf keinen grünen
> Zweig gekommen, ich habe es nicht so recht verstanden.

Was genau hast du daran nicht verstanden?

Du willst das alles so benutzen können (in main())
1
    Natset liste = new Natset();
2
    
3
    //Listenelemente hinzufügen
4
    liste.append( new MyNode(1) );
5
    liste.append( new MyNode(2) );
6
    liste.append( new MyNode(3) );
7
    liste.append( new MyNode(4) );
8
    liste.append( new MyNode(5) );
9
10
    MyNode loop = liste.first();
11
    while( loop != null ) {
12
      System.out.println( loop );
13
      loop = liste.next( loop );
14
    }


Ich denke, du hast schon mal eine Liste geschrieben? Dann musst du doch 
wissen, wie man sowas benutzt.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Deine address Variable muss da raus. Der
> Verwender der Liste muss das selber verwalten. d.h. er befragt die
> Liste: welches ist dein erster Knoten? Und dann befragt er den Knoten
> selber: Welches ist dein Nachfolger. SOlange, bis ein Knoten kommt, der
> von sich sagt: Ich hab keinen Nachfolger mehr.

Ich sag jetz mal "jein" ;)
Dafür wurde in Java die Collection API erfunden insbesondere der 
Iterator/Enumeration.
http://download.oracle.com/javase/6/docs/api/java/util/Enumeration.html

Eine solche Liste sollte also idealerweise eine Methode:
1
Iterator<MyNode> getIterator()
2
Iterator<MyNode> getReverseIterator()
Soviel erstmal zur allgemeinen Verwirrung ;)

Karl Heinz Buchegger schrieb:
> Ich denke, du hast schon mal eine Liste geschrieben? Dann musst du doch
> wissen, wie man sowas benutzt.

Deshalb hab ich ja vorher gefragt welche Operationen den implementiert 
werden sollen...

von Purzel H. (hacky)


Lesenswert?

> public int nextItem()
> public int previousItem()

weshalb int ? Da moechte man den pointer auf den Knoten bekommen.
Das Item zieht man aus dem knoten selbst. Nur dan kann man in einem Loop 
weitermachen.

> public void append(int a)
> public void setStart()

weshalb void ? Da moechte man den pointer auf den Knoten bekommen.

von java (Gast)


Lesenswert?

Also jetzt habe ich es komplett ohne Hilfsvariablen gemacht.
Jeder Knoten gibt seinen nächsten zurück.
Und jeder Knoten erzeugt seinen Nachfolger, wobei nur der letzte Knoten 
einen erzeugen sollte. Der Startknoten könnte das zwar auch, ist aber 
nicht gerade sinnvoll.
1
public class Aufgabe10 {
2
3
  public static void main(String[] args) {
4
    // System.out.println("hello");
5
6
    // Neue Liste erzeugen
7
    Natset liste = new Natset();
8
9
    // Startpunkt erstellen
10
    liste.setStart();
11
12
    liste.addElement(1);
13
    liste.addElement(2);
14
    liste.addElement(3);
15
    liste.addElement(4);
16
17
    liste.printList();
18
19
  }
20
21
}
22
23
24
public class Natset {
25
26
  private MyNode start;
27
  private MyNode last;
28
  private int size;
29
30
  public Natset() {
31
  }
32
33
  public void setStart() {
34
    // Start festlegen
35
    start = new MyNode();
36
    last = start;
37
  }
38
39
  public void addElement(int a) {
40
    last = last.append(a);
41
    size++;
42
  }  
43
  
44
  public void printList()
45
  {
46
    MyNode x;
47
    x = start;
48
    while(x.getNext() != null)
49
    {
50
      x = x.getNext();
51
      System.out.println(x.getValue());      
52
          
53
    }    
54
  }
55
56
  public int getSize() {
57
    return size;
58
  }
59
60
}
61
62
63
64
public class MyNode {
65
66
  private int value;
67
  private MyNode next;
68
  private MyNode previous;
69
70
  public MyNode() {
71
  }
72
73
  public MyNode append(int a) {
74
    next = new MyNode();
75
    next.previous = this;
76
    next.setValue(a);
77
    return next;
78
  }
79
80
  public int getValue() {
81
    return value;
82
  }
83
84
  public void setValue(int m) {
85
    value = m;
86
  }
87
88
  public MyNode getNext() {
89
    return next;
90
  }
91
92
  public MyNode getPrevious() {
93
    return previous;
94
  }
95
96
}

von Karl H. (kbuchegg)


Lesenswert?

> Dafür wurde in Java die Collection API erfunden insbesondere der
> Iterator/Enumeration.
> http://download.oracle.com/javase/6/docs/api/java/util/Enumeration.html
>
> Eine solche Liste sollte also idealerweise eine Methode:
>
1
Iterator<MyNode> getIterator()
2
> Iterator<MyNode> getReverseIterator()
Soviel erstmal zur
> allgemeinen Verwirrung ;)

Ich wollte ihn nicht auch noch mit Iteratoren verwirren. Klar sind 
Iteratoren die bessere Lösung.


> Der Startknoten könnte das zwar auch, ist aber nicht gerade sinnvoll.

Ich kann der Idee noch nichts abgewinnen, dass eine leere Liste aus 
einem sonst nicht weiter benutzten Startknoten besteht nicht. Aber ok, 
damit kann man leben und manche Dinge werden dann tatsächlich einfacher.

Viel lästiger finde ich allerdings, wenn ich explizit setStart aufrufen 
muss. Wozu soll das gut sein? Ohne kann ich die Liste sowieso nicht 
verwenden, also kann auch gleich der Konstruktor die Liste so 
herrichten, dass ich keinen Fehler (setStart aufrufen vergessen) machen 
kann. Deswegen gibt es Konstruktoren, die ein Objekt erst mal in einen 
benutzbaren Zustand bringen, damit sich ein Verwender nicht mit 
'Kleinigkeiten', wie dem Aufrufen von Initialisierungsfunktionen, 
beschäftigen müssen. Der Unterschied: Der Konstruktur wird IMMER 
aufgerufen, wenn ein Objekt erzeugt wird, das kann ich als Verwender 
daher nicht vergessen. setStart ist daher so nicht notwendig, was 
allerdings nicht heißt, das sie sinnlos wäre. Aber in einem anderen 
Zusammenhang. Durch die Garbage Collection von Java übernimmt dein 
'setStart' die Funktionalität: lösche die komplette Liste. Also nenne 
die Funktion auch entsprechend und sorge dafür, dass clear immer 
aufgerufen werden kann und das richtige vollständig macht.
1
  public Natset() {
2
    clear();
3
  }
4
5
  public void clear() {
6
    start = new MyNode();
7
    last = start;
8
    size = 0;
9
  }

von java (Gast)


Lesenswert?

Soweit mal Danke,

ich habe die Methode addElement() mal geändert:
1
public void addElement(int a) {
2
    if (size == 0) {
3
      start = new MyNode();
4
      last = start;
5
      start.setValue(a);
6
    } else {
7
      last = last.append(a);
8
    }
9
    size++;
10
  }

Jetzt gibt es nur dann einen Knoten, wenn wirklich ein Element 
hinzugefügt wird.
Und den Konstruktor hätte ich vorher tatsächlich verwenden können, aber 
ich bin noch nicht so fit mit Java, aber danke für den Hinweis.

von java (Gast)


Lesenswert?

Ach ja und löschen der Liste mache ich einfach mit
1
public void clear()
2
{
3
  start = null;
4
  last = null;
5
  size = 0;
6
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.