doppelt verkettete liste

ETlearner

Mitglied
hallo,
ich muss in meiner hausaufgabe mit einer klasse für doppeltverkettete Listen arbeiten.
es gibt 4 methoden, die ich implementieren muss :
1. Implementieren Sie die Methode void appendHead(T element), die ein neues Element
an den Anfang der Liste anfugt.
2. Implementieren Sie die Methode T popHead(), die das Element am Anfang der Liste
zuruckgibt und entfernt.
3. Implementieren Sie die Methode void appendTail(T element), die ein neues Element
an das Ende der Liste anfugt.
4. Implementieren Sie die Methode T popTail(), die das Element am Ende der Liste zuruckgibt
und entfernt.

appendhead und appendtail funktionieren.

doch bei der methode poptail wird das vorletzte element gelöscht anstatt das letzte...
und bei der pophead-methode das zweite element anstatt das erste...

pophead-Methode:
Java:
  T popHead(){
	if(head==null){
		return null;}
	
	else{
		Node a= head.next;
		head.next=head.next.next;
		head.next.prev=head;
		return a.value;
		
		}
	
	}

poptail-Methode:
Java:
 T popTail(){
	if (head==null){
		return null;
		}
	else{
		Node a= tail;
		tail.prev.next=null;
		return a.value;
		}
		}

wo ist mein fehler?

danke im voraus
mfg
 
S

SlaterB

Gast
was soll man da sagen, der Code steht da und so ist es auch?!

wenn die Liste mit drei Elementen A, B, C beginnt, wovon A der head ist,
dann heißt:
> head.next=head.next.next;
lasse A auf C zeigen,

also wird B, das bisherige head.next, herausgeschnitten, dessen value gibst du ja auch zurück,
das return ist quasi direkt als 'head.next.value' abzulesen

was ist daran jetzt als Rätsel zu lösen?
das erste Element ist head, die Rückgabe head.value wäre vom ersten Element, head.next.value ist vom zweiten,

genauso deutlich könntest du eine Methode
Java:
int a = ..
int b = ..;
return a;
schreiben und fragen warum a und nicht b zurückgegeben wird,
eben genau weil du es so gecodet hast, ohne versteckte Rätsel, einfach von dem einen zum anderen wechseln..,

dass es bei deiner Methode nicht ganz leicht ist, head zu löschen, ist klar,
wenn du dabei Probleme oder Fragen hast, kann man dazu vielleicht nachdenken,
aber die Frage ob das erste oder zweite.., die läßt ja eher vermuten dass du keine Zeile des Codes verstehst/ selber geschrieben hast
 

Sesostris

Aktives Mitglied
Das erinnert schon sehr stark an deine letzte Hausaufgabe: Listen und Generics
Bereits damals hast du viele hilfreiche Antworten bekommen, die - wenn ich mir deine Codefragmente so ansehe - bei dir nicht wirklich angekommen sein können. Beschäftige dich lieber mit einer einfach verketteten Liste, bevor du dich an mehrfach verkettete Listen wagst.

Als Tipp kann ich dir noch mitgeben, dass du bei deinen pop-Methoden immer drei Fälle unterscheiden musst:
1. leere Liste
2. einelementige Liste
3. mehrelementige Liste

Das kann aber nur funktionieren, wenn head und tail in ihren jeweiligen push-Methoden richtig gesetzt wurden - was ich bei dir mangels Code leider nicht überprüfen kann.
 

ETlearner

Mitglied
hast recht... die frage war wirklich unnötig :D

ich komme nicht darauf wie ich head löschen kann...

ich würde es mir so denken:
sei A B C die liste...
zuerst speicher ich die daten von A ab...
durch head.next.prev=null; müssten die daten von head ja eigentlich gelöscht werden oder?...
dann gebe ich die daten von A zurück

Java:
T popHead(){
	if(head==null){
		return null;}
	
	else{
		Node a= head; 
		head.next.prev=null;
		
		return a.value;
		
		}
	
	}
 

ETlearner

Mitglied
und hier ist die ganze klasse
Java:
public class DoubleLinkedList <T> {
	
	
	public class Node{	
		private T value;
		private Node next;
		private Node prev;
		public Node(T value, Node next, Node prev){
			this.value=value;
			this.next=next;
			this.prev=prev;
			}
	}
	
private Node head;
private Node tail;
public DoubleLinkedList(){
	head=null;
	tail=null;
	}
public void appendHead (T value){
	head=new Node(value, head, null);
	if(tail==null){
			tail=head;}
	else{
			head.next.prev=head;
			}
	}
	
T popHead(){
	if(head==null){
		return null;}
	
	else{
		Node a= head;
		head.next.prev=null;
		
		return a.value;
		
		}
	
	}

public void appendTail(T value){
	tail= new Node(value, null, tail);
	if(head==null){
		head=tail;}
	else{
		tail.prev.next=tail;
		}
	}
	
T popTail(){
	if (head==null){
		return null;
		}
	else{
		Node a= tail;
		tail.prev.next=null;
		return a.value;
		}
		}
		
	
public void printForward(){
	Node a= head;
	while(a.next!=null){
		System.out.println(a.value);
		a=a.next;
		}
	System.out.println(tail.value);
	System.out.println("\n");
	}
	
	
void printBackward(){
	Node a=tail;
	while(a.prev!=null){
		System.out.println(a.value);
		a=a.prev;
		}
	System.out.println(head.value);
	System.out.println("\n");
	}
	
	
	
	
	
	
}
 

ETlearner

Mitglied
so funktionierts :
Java:
T popHead(){
	if(head==null){
		return null;}
	
	else{
		Node a= head;
		head=head.next;
		
		return a.value;
		
		}
	
	}
 

Sesostris

Aktives Mitglied
Für eine mehrelementige Liste sollte popHead() in etwa so aussehen:
Java:
			Node a = head;
			head = head.next;
			head.prev = null;
			return a.value;
Bei popTail() ersetzt du jedes head durch tail und jedes next durch prev und umgekehrt.

Aber - und ich wiederhole mich - du musst noch den Sonderfall einer einelementigen Liste beachten.

EDIT: Wenn du, wie in deinem letzten Beitrag, head.prev = null; weglässt, dann wird die head-Referenz zwar korrekt um ein Element verschoben, aber das alte head-Element befindet sich noch immer in deiner Liste.
 
Zuletzt bearbeitet:

ETlearner

Mitglied
im falle, dass es nur ein element gibt müsste die methode doch auch wiederum klappen oder?


Node a = head; -->a speichert daten von head bzw. tail ab da head == tail
head = head.next; -->head ist head.next... also null
head.prev = null; -->head.prev ist ja eh schon die nullreferenz
return a.value;

oder würde es in diesem fall nicht funktionieren?
 

Sesostris

Aktives Mitglied
Probier es doch aus. Meiner Meinung nach sollte das eine NullPointerException geben. Warum? Weil bei einer einelementigen Liste, wie du bereits richtig erkannt hast, head und tail auf den selben Knoten zeigen, musst du danach auch beide auf null setzen.

EDIT: Die NullPointerException gibts es genau hier...
Node a = head; -->a speichert daten von head bzw. tail ab da head == tail
head = head.next; -->head ist head.next... also null
head.prev = null; -->head.prev ist ja eh schon die nullreferenz
return a.value;
Da head "eh schon die nullreferenz" ist, kann man auch nicht auf die Instanzvariable prev zugreifen.
 
Zuletzt bearbeitet:

ETlearner

Mitglied
Java:
T popHead(){
	if(head==null){
		return null;}
	
	else if(head==tail){
		Node a=head;
		head=null;
		tail=null;
		return a.value;
		}

		
	else{
		  Node a = head;
            head = head.next;
            head.prev = null;
            return a.value;
		}
	
	}


ist es so richtig?
 

ETlearner

Mitglied
Java:
public class DoubleLinkedList <T> {
	
	
	public class Node{	
		private T value;
		private Node next;
		private Node prev;
		public Node(T value, Node next, Node prev){
			this.value=value;
			this.next=next;
			this.prev=prev;
			}
	}
	
private Node head;
private Node tail;
public DoubleLinkedList(){
	head=null;
	tail=null;
	}
public void appendHead (T value){
	head=new Node(value, head, null);
	if(tail==null){
			tail=head;}
	else{
			head.next.prev=head;
			}
	}
	
T popHead(){
	if(head==null){
		return null;}
	
	else if(head==tail){
		Node a=head;
		head=null;
		tail=null;
		return a.value;
		}

		
	else{
		  Node a = head;
            head = head.next;
            head.prev = null;
            return a.value;
		}
	
	}

public void appendTail(T value){
	tail= new Node(value, null, tail);
	if(head==null){
		head=tail;}
	else{
		tail.prev.next=tail;
		}
	}
	
T popTail(){
	if (head==null){
		return null;
		}
	else if(head==tail){
		Node a=head;
		head=null;
		tail=null;
		return a.value;
		}
	else{
		Node a= tail;
		tail=tail.prev;
		tail.next=null;
		return a.value;
		}
		}
		
	
public void printForward(){
if(head==null){System.out.println("LEERE LISTE");
				}
else{
	Node a= head;
	while(a.next!=null){
		System.out.println(a.value);
		a=a.next;
		}
	System.out.println(tail.value);
	System.out.println("\n");
	}}
	
	
void printBackward(){
	if(head==null){System.out.println("LEERE LISTE");
				}
	else{
	Node a=tail;
	while(a.prev!=null){
		System.out.println(a.value);
		a=a.prev;
		}
	System.out.println(head.value);
	System.out.println("\n");
	}
	
	
	
}}
jetzt funktionieren alle methoden -.-^^
ich glaube so ist das programm vollständig...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
B Doppelt Verkettete Liste - Ist alles gut so? Java Basics - Anfänger-Themen 3
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
L Doppelt verkettete Liste Java Basics - Anfänger-Themen 6
R doppelt verkettete Liste aus Arrays erstellen Java Basics - Anfänger-Themen 1
S Doppelt verkettete Liste Java Basics - Anfänger-Themen 3
G Doppelt Verkettete Liste Java Basics - Anfänger-Themen 2
A Doppelt Verkettete Liste Java Basics - Anfänger-Themen 16
E Datentypen Doppelt verkettete Liste Java Basics - Anfänger-Themen 10
P Einfügen in doppelt verkettete Liste Java Basics - Anfänger-Themen 7
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
N doppelt verkettete liste einfügen Java Basics - Anfänger-Themen 7
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
W Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 2
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
D doppelt verkettete Liste Java Basics - Anfänger-Themen 16
S Doppelt Verkettete Liste Java Basics - Anfänger-Themen 7
M Doppelt verkettete Liste Zeiger Vorgänger beim Einfügen Java Basics - Anfänger-Themen 2
J doppelt verkettete Liste Java Basics - Anfänger-Themen 5
L doppelt verkettete Liste Java Basics - Anfänger-Themen 6
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 12
B Doppelt verkettete Liste Java Basics - Anfänger-Themen 16
R Datentyp Ring - zyklisch doppelt verkettete Liste - HILFE! Java Basics - Anfänger-Themen 12
R doppelt verkettete Liste Java Basics - Anfänger-Themen 8
F doppelt verkettete liste! Java Basics - Anfänger-Themen 8
R doppelt verkettete azyklische Liste Java Basics - Anfänger-Themen 2
T Klasse in Java für doppelt verkettete Listen Java Basics - Anfänger-Themen 4
H Doppelt verkettete Listen Java Basics - Anfänger-Themen 2
S doppelt verkettete Listen Java Basics - Anfänger-Themen 4
X Vererbung: Doppelt verkettete Listen Java Basics - Anfänger-Themen 16
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
N package wird doppelt im exporer angezeigt Java Basics - Anfänger-Themen 2
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
J Fehler beim generieren von 4 Zufallszahlen Zahl doppelt ist eigentlich ausgeschlossen Java Basics - Anfänger-Themen 9
T Löschen in doppelt verketteter Liste Java Basics - Anfänger-Themen 1
L Input/Output Println wird doppelt ausgeführt Java Basics - Anfänger-Themen 11
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
B BufferedReader gibt Datei-Inhalt doppelt aus Java Basics - Anfänger-Themen 3
M Liste Implementation, doppelt next() Java Basics - Anfänger-Themen 13
D Klassen Doppelt so viele Elemente in Arraylist ? Java Basics - Anfänger-Themen 4
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
T Java Methode wird unerwünscht doppelt aufgerufen?! Java Basics - Anfänger-Themen 4
OnDemand Doppelt Werte CSV Java Basics - Anfänger-Themen 2
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
N Erste Zeile bei BufferedReader doppelt lesen? Java Basics - Anfänger-Themen 2
E Erste Schritte Sortieren von Objekten in doppelt-verlinkter Liste Java Basics - Anfänger-Themen 9
S Methoden Methode wird doppelt aufgerufen ... Java Basics - Anfänger-Themen 5
J Mehrere Zufallszahlen erzeugen, aber keine darf doppelt erzeugt werden - Wie? Java Basics - Anfänger-Themen 5
B Doppelt gekettete Listen Java Basics - Anfänger-Themen 4
G PropertyChangeListener empfängt Events doppelt Java Basics - Anfänger-Themen 5
L doppelt verkette Liste Java Basics - Anfänger-Themen 5
H Fenster doppelt gezeichnet. Java Basics - Anfänger-Themen 2
G Einfügen aus Zwischenablage - alles doppelt? Java Basics - Anfänger-Themen 2
G JFileChooser kommt doppelt Java Basics - Anfänger-Themen 3
N Nullpointerexception bei Doppelt verketteter Liste Java Basics - Anfänger-Themen 7
M Listen richtig doppelt verkettet? Java Basics - Anfänger-Themen 13
D Exceptions in doppelt verketteter Liste Java Basics - Anfänger-Themen 5
C verify() wird doppelt aufgerufen (JTable + InputVerifier) Java Basics - Anfänger-Themen 8
H doppelt verkette liste Java Basics - Anfänger-Themen 2
L rückwärtsausgeben einer doppelt verketteten liste Java Basics - Anfänger-Themen 2
G JList und ListCellRenderer - Vector erscheint doppelt Java Basics - Anfänger-Themen 6
G JComboBox gibt SelectedItem immer doppelt aus Java Basics - Anfänger-Themen 4
B Array doppelt Felder löschen Java Basics - Anfänger-Themen 27
M Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 2
R Zeilen aus datei lesen + doppelt gespeichert? Java Basics - Anfänger-Themen 3
G Trotz Abfrage immer noch Zahlen doppelt Java Basics - Anfänger-Themen 3
R Benutzerregistrierung: Doppelt registriert. Java Basics - Anfänger-Themen 8
M Verkettete Liste Java Basics - Anfänger-Themen 1
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
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
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
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
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
A Verkettete Liste Java Basics - Anfänger-Themen 2
L verkettete Liste Java Basics - Anfänger-Themen 15
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
H Verkettete Liste Java Basics - Anfänger-Themen 7
N Verkettete liste rückwärts ausgeben Java Basics - Anfänger-Themen 18
K Verkettete Liste und seine Methoden Java Basics - Anfänger-Themen 1
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
N Verkettete Liste implementieren Java Basics - Anfänger-Themen 5
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben