Doppelt verkettete Liste

Strim

Mitglied
Hi,

ich muss für die Uni ne doppelt verkettete Liste in Java implementieren. Ich weiß nicht wieso meine ersten 4 Methoden nicht korrekt funktionieren. Würde mich über Tipps und Anregungen freuen.
Die Klasse für die Elemente könnt ihr euch ja dazu denken. Der Konstruktor der Elemente sieht so aus:


Java:
public ListElement(String content, ListElement prev, ListElement next){
		this.content = content;
		this.next = next;
		this.prev = prev;
	}

Und hier meine ListenMethoden:

Java:
void addFirst(String value) {

		if (first == null) {		//falls Liste leer ist
			ListElement newFirst = new ListElement(value, null, null);
			first = newFirst;
			last = first;
		} else {					//falls nicht
			ListElement newFirst = new ListElement(value, null, first);
			first.setPrev(newFirst);
			first = newFirst;
		}
		size++;
	}

	void addLast(String value) {
		if (first == null) {		//falls Liste leer ist
			addFirst(value);
		} else {					//falls nicht
			ListElement newLast = new ListElement(value, last, null);
			newLast.setPrev(last);
			last = newLast;
			
		}
                        size++;
	}

	void add(int index, String value) {
		ListElement currentElement = this.first;

		int i = 0;
		while (i < index) {
			if (currentElement.getNext() != null) {
				currentElement = currentElement.getNext();
			}
			i++;
		}
		

		if (currentElement.getPrev() == null) {
			this.addFirst(value);
		}
		if (currentElement.getNext() == null) {
			this.addLast(value);
		}

		ListElement prevElement = currentElement.getPrev();

		ListElement newElement = new ListElement(value, prevElement,
				currentElement);

		currentElement.setPrev(newElement);
		prevElement.setNext(newElement);

		size++;
	}

	String get(int index) {
		ListElement currentElement = this.first;
		int i = 0;
		while (i <= index && currentElement.getNext() != null) {

			currentElement = currentElement.getNext();

			i++;
		}
		return currentElement.getContent();
	}


:rtfm:
 
Zuletzt bearbeitet:
Also beim Überfliegen fällt mir auf dass dein else-Teil in addLast schon einmal falsch ist.
Java:
else {                    //falls nicht
            ListElement newLast = new ListElement(value, last, null);
            newLast.setPrev(last);
            last = newLast;
            
        }

newLast.setPrev(last); ist an dieser Stelle verkehrt, das Setzen von prev für das Element newLast hast du ja bereits schon getan im Konstruktor.
Was dort noch fehlt ist jetzt dem aktuellen last zu sagen wer sein nächstes Element ist
Code:
last.setNext(newLast);

Dann könnte es evtl. schon funktionieren.
 
Danke, war n Leichtsinnsfehler. Und bei void add() hab ich bei dem letzten Block nach der if-Bedingung ein else vergessen. Jetzt klappts.

Mfg, Strim
 
Ich muss jetzt noch einen Ringpuffer machen, der unendlich groß sein kann. Bin nicht sicher ob ich richtig verstanden habe was ein Ringpuffer ist. Habe das so verstanden dass man Elemente reinhauen kann, und wartschlangenmäßig dann nur das rausholen das am längsten drin ist.

Wäre nett wenn mir jemand sagen könnte ob das so korrekt ist, funktionieren tut es, ich glaube nur nicht dass ich ganz verstanden habe was der Ringpuffer machen soll.

Mfg

Java:
public class Ringpuffer {

	private ListElement first;
	private ListElement last;
	private int size = 0;
	
	
	public void add (String value){
		
		
		if (this.first == null) {
			ListElement newFirst = new ListElement(value, null, null);
			this.first = newFirst;
			this.last = this.first;
		}

		else {

			ListElement newFirst = new ListElement(value, null, this.first);
			this.first.setPrev(newFirst);
			newFirst.setNext(this.first);
			this.first = newFirst;
		}
		
		size++;
		
	}
	
	
	public String get (){
	
			
		if (size == 1) {
			ListElement oldLast = this.last;
			last = null;
			size--;
			return oldLast.getContent();
		} else if (last == null) {
			return "";
		} else {
			ListElement oldLast = this.last;
			last = last.getPrev();
			last.setNext(null);
			size--;
			return oldLast.getContent();
		}
		
		
		
		
		
	}
 

Zurück
Oben