Java Eigene Liste - Objekte Löschen

Sabri

Newbie
Dabei seit
Mai 2010
Beiträge
1
Hallo. Eigenen Liste zu erstellen gehört irgendwie zum standard alle Java Vorlesungen. Das einfügen von Objekten habe ich noch irgendwie verstanden aber jetzt soll man auch irgendwie selber Objekte löschen. Eigentlich aus der Theorie einfach: Will ich zum Beispiel den Letzten löschen gehe ich einfach so lange weiter bis der letzte Objektzeiger (schwanz oder auch tail genannt) auf null zeigt. Dann ist das eigentlich der letzte Objekt und den nulle ich dann einfach. Will nicht viel Code kopieren aber ich glaube das problem liegt nicht in der Theorie sondern im Code, das ich da was falsch mache:

Code:
public class List {

 	Object head;
	List tail;
	
	public List() {
		tail = null;
	}
	public List(Object head, List tail) {
		this.head = head;
		this.tail = tail;
	}

                //viel code...

	public void lastRemove() {
		while(!(this.tail.tail == null)) {
			this.tail = tail; //aktueller pointer zeigt auf dem nächsten
		}
		this.tail = null; //der vorletzte zeiger zeigt nicht mehr auf dem letzten sondern ins nichts (somit wird er der letzte head)
	}
}
Naja wie ich das mache, der will nicht. Irgendwas mache ich falsch. Ich kann nicht mal den ersten Objekt löschen. Nehmen wir an ich hätte nur zwei und möchte nur irgend ein loswerden (bzw. den ersten), dann sage ich einfach sofort am anfang ohne if und while: this.tail = null, dann müsste ich doch eigentlich nur einen haben oder? Naja irgendwie sind in der Ausgabe alle Objekte drinne. Glaube habe was am Javacode falsch verstanden.
 

apolyton

Lt. Junior Grade
Dabei seit
Nov. 2007
Beiträge
390
Wenn du die Funktionsweise von Listen besser verstehen möchtest, dann schau doch mal direkt in den entsprechenden Source Code rein wie Java das implementiert hat
 

Sniker

Cadet 2nd Year
Dabei seit
Juli 2006
Beiträge
28
Benutzt du zufällig eine IDE wie Eclipse? Dann würde dir die IDE sagen das this.tail = tail; überhaupt nichts macht. wenn man das this weg macht, steht tail = tail. Wenn du dich in der Liste weiter bewegen willst musst du schon this.tail = tail.tail machen. Das ist aber auch falsch weil er dann jede Liste auf ein Element verringert.
Versuch mal sowas
Code:
	public void lastRemove() {
                List tail = this.tail;
                List before = null;
		while(!(tail.tail == null)) {
                        before = tail; // Merkt sich das zuletzt besuchte Element
			tail = tail.tail; //aktueller pointer zeigt auf dem nächsten
		}
		before.tail = null; //der vorletzte zeiger zeigt nicht mehr auf dem letzten sondern ins nichts (somit wird er der letzte head)
	}
Wobei das innerhalb das Liste zu realisieren ist schwierig, weil du wenn das nur noch ein Element vorhanden ist dies nicht mehr löschen kannst. In diesem Fall würdest du eine NullPointerException bekommen.
Besser ist es eine Container klasse zu erstellen die die Liste enthält von der du dann auch das Element löschen kannst, dass an Root hängt.
 
Zuletzt bearbeitet:

Cobinja

Lt. Junior Grade
Dabei seit
Juli 2006
Beiträge
454
Zusätzlich zu Snikers Post:

Mach aus while(!(tail.tail == null)) { folgendes:
Code:
while(tail != null && tail.tail != null) {
Sonst hast du ein Problem, wenn du nur ein Element in der Liste hast (NullPointerException).
 

DonnyDepp

Lt. Commander
Dabei seit
März 2008
Beiträge
1.533
das letzte element einer liste zu entfernen funktioniert nicht direkt im rootelement, so wie es oben im code angedacht ist.

du musst da bis zum letzten element durchlaufen und dann die referenz darauf aus dem vorletzten element entfernen, dann kommt der garbage collector und wirfts weg.

also so:

Code:
public void lastRemove() {
		if(this.tail != null) {
			tail.lastRemove(); //aktueller pointer zeigt auf dem nächsten
		}
                else {
                        ((List) head).tail = null
                }
	}
und normalerweise nennt man die beiden referenzen previous und next oder so in der art.
und head sollte ebenfalls vom typ "List" sein, dann sparste dir das casten.


und wennde das mit der whileschleife und dem this.tail = tail.tail machst, entfernst du nicht nur das letzte element, sondern verwirfst auch alle anderen listenelemente xD
außer du hast wirklich noch nen element "next" oder sowas, was du aber nicht angegeben hast.
 
Zuletzt bearbeitet:

NullPointer

Lt. Commander
Dabei seit
Okt. 2009
Beiträge
1.570
DonnyDepp: Ich denke, "head" soll nicht der Zeiger auf das vorhergehende Element sein, sondern der Inhalt des Listenelements. Das heißt natürlich auch, daß deine Lösung so nicht funktioniert; es müßte so laufen:

Code:
public void lastRemove() {
		if(this.tail.tail != null) {
			tail.lastRemove(); //aktueller pointer zeigt auf dem nächsten
		}
                else {
                        this.tail = null;
                }
	}
 

refri89

Cadet 4th Year
Dabei seit
Mai 2010
Beiträge
95
Der Code bei Dir hat's schwer, denn ich find schon den Entwurf der Liste eher suboptimal/unübersichtlich, wenn ichs dir mal so sagen darf. Wahrscheinlich willst du auf eine (single) Linked List hinaus soweit ich es zu entziffern glaube, aber das war ja nicht deine Frage...
Ergänzung ()

public class ListElement
{
private ListElement next;

public ListElement()
{
next=null;
}
}

public class List
{
private ListElement root;

public List()
{
root = null;
}

public void removeLast()
{
ListElement iterator,newLastElement;

if( root == null ) return;
iterator = root;
newLastElement=root;

while(itertor.next != null)
{
newLastElement = iterator;
iterator = iterator.next;
}

newLastElement.next=null;
iterator=null;
}
}
 
Zuletzt bearbeitet:
Top