Doppelt Verkettete Listen

Status
Nicht offen für weitere Antworten.

Lukas_G1

Mitglied
Hallo Leute. Ich hab versucht meinen Quellcode für einfach verkettete Listen umzuschreiben so dass es zu Doppelt verketteten Listen wird. Leider komm ich nicht so ganz zurecht. Ich weis nur folgendes: ich muss nur die methoden insert und delete anpassen, stimmt das? wäre nett wenn ihr mir da weiterhelfen könntet. Tausend dank im Vorraus.


Code:
public class Cons2 {
    
    /** Creates a new instance of Cons2 */
    public Object obj; // das Objekt in dieser Zelle
    public Cons2 next; 
    public Cons2 prev;
// Verweis auf die naechste Zelle
    public Cons2(Object obj) {
        this.obj = obj;
        next = null;
        prev = 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());
	}
}
 
G

Guest

Gast
Ja, du musst diese Methoden umschreiben.
Überleg dir einfach, was passieren muss, wenn ein Element in die Liste eingefügt wird.
Als Tipp nur das: Lasse das Head-Element auf sich selbst verweisen (prev und next), wenn es das einzige Element
in der Liste ist und füge neue Elemente vor das Head-Element ein (head.prev ist dann das neue Element).
Für die Vergleiche beim Entfernen solltest du liebe equals statt == verwenden.
 

Lukas_G1

Mitglied
ok ich hab da mal was versucht.

Code:
public void insert(Object obj) {
		Cons2 cons = new Cons2(obj);	// neue Cons-Zelle
		cons.next = foot;			
		foot = cons;
                cons.prev =head;
		if (foot == null) foot = head;
	}

jetzt ist das nächste Element der Fuß und das Vorherige der Kopf. Stimmt das jetzt so?
 
G

Guest

Gast
Lukas_G1 hat gesagt.:
ok ich hab da mal was versucht.

Code:
public void insert(Object obj) {
		Cons2 cons = new Cons2(obj);	// neue Cons-Zelle
		cons.next = foot;			
		foot = cons;
                cons.prev =head;
		if (foot == null) foot = head;
	}

jetzt ist das nächste Element der Fuß und das Vorherige der Kopf. Stimmt das jetzt so?
Nein. Der Vorgänger des neuen Elements ist nicht immer das Head-Element. Du verlierst auch die Verbindung vom
alten, letzten Element zum neuen Element. Auf das 'foot' kannst du verzichten. Es ist immer 'head.prev'

Es wäre zwar einfacher dir direkt die Lösung zu zeigen, du solltest es aber auch nachvollziehen können. Das macht
mehr Spass, wenn man selbst auf die Lösung kommt.

Denke an einen Kreis von Menschen, die jeweils den links- und rechtsstehenden (prev/next) an der Hand halten.
Wenn neue Menschen hinzu kommen, darf die Verbindung zu keinem Zeitpunkt verloren gehen. Der Kreis muss
zu jedem Zeitpunkt geschlossen bleiben. Es gibt eine Bezugsperson (head), die den Anfang des Kreises markiert.
Alle neuen Personen ordnen sich immer links von der Bezugsperson ein.

:bae: :wink:
 

Lukas_G1

Mitglied
Code:
public void insert(Object obj) { 
      Cons2 cons = new Cons2(obj);   // neue Cons-Zelle 
     if (head == foot) { 
           
          cons.prev = cons; 
          cons.next = foot; 
          head = cons; 
       } 
       
       cons.next = head; 
       
       if (head != foot) { 
              
       head.prev = cons; 
          head = cons; 
       cons.prev = foot; 
       }
   }

wenn das jetzt nicht stimmt hab ich echt keine Ahnung mehr...
 
U

UJ

Gast
Hi,
warum verwendest du keinen Iterator auf der Liste? Das dürfte für das einfache vorwärts-/ rückwärts- Durchlaufen der Liste und auch für das Einfügen von Elementen genügen...
 
G

Guest

Gast
Lukas_G1 hat gesagt.:
wenn das jetzt nicht stimmt hab ich echt keine Ahnung mehr...
Das ist der springende Punkt. Wenn du es verstanden hast, kannst du die Korrektheit selbst verifizieren.
Wie ich dir schon empfohlen habe, lass das foot weg, es verkompliziert es nur, hilft aber wenig.
Code:
Cons2 cons = new Cons2(obj);
if(head == null) { // Noch nix drin, dann neues Element als head setzen
   head = cons;
}

cons.previous = head.previous; // Vorgänger des neuen Elements verlinken
cons.next = head;              // Nachfolger des neuen Elements verlinken
head.previous = cons;          // Neues Element als Vorgänger des Head-Elements verlinken
cons.previous.next = cons;     // Das alte, letzte Element mit dem neuen Element als Nachfolger verlinken
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M doppelt verkettete Listen Allgemeine Java-Themen 2
M doppelt verkettete Listen? Allgemeine Java-Themen 5
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
R doppelt verkettete Liste: Fehler beim Einfügen Allgemeine Java-Themen 3
chik Doppelt verkettete Liste bzw. Zirkulärliste (kleiner Fehler, den ich nicht finde) Allgemeine Java-Themen 4
F Doppelt verkettete Liste sortieren? Allgemeine Java-Themen 8
J Doppelt verkettete Liste Allgemeine Java-Themen 6
N warum wird es doppelt ausgegeben Allgemeine Java-Themen 6
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
S If-Menü wird doppelt ausgegben Allgemeine Java-Themen 4
D "Paste" String doppelt Allgemeine Java-Themen 14
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
Sin137 Interface Eingabe wird doppelt angezeigt Allgemeine Java-Themen 2
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
N Fehler abfang läuft doppelt durch Allgemeine Java-Themen 2
ARadauer Random keine Zahlen doppelt Allgemeine Java-Themen 4
M Alles doppelt in Eclipse syntaxhilfe Allgemeine Java-Themen 6
C Vier Stellen Keine Doppelt (Zufall) Allgemeine Java-Themen 20
G Array doppelt verkettet? Allgemeine Java-Themen 6
L doppelt gelinkte liste /getFirst/removeFirst/clear/Remove Allgemeine Java-Themen 2
S Thread wird nach erneutem Instanzieren doppelt gestartet!? Allgemeine Java-Themen 4
I Doppelt verkette Listen Allgemeine Java-Themen 2
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
K verkettete Liste Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
T Verkettete Suche Allgemeine Java-Themen 6
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
D Einfach verkettete Liste Allgemeine Java-Themen 3
X einfach verkettete Liste und Insertion Sort Allgemeine Java-Themen 3
R Verkettete Liste Allgemeine Java-Themen 5
E Verkettete Listen Allgemeine Java-Themen 5
M Schlange als verkettete Liste Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
L Listen Allgemeine Java-Themen 3
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
E Listen in Java aneinanderfügen, subtrahieeren usw. Allgemeine Java-Themen 14
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
S Permutation und Listen Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
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
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
F Problem mit Java Listen Allgemeine Java-Themen 4
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
C Listen in Java. Anehängter Code nicht ganz klar Allgemeine Java-Themen 19
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 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

Ähnliche Java Themen

Neue Themen


Oben