Vererbte Liste

Status
Nicht offen für weitere Antworten.
R

Reap

Gast
Hallo....ich hab jetzt mal eine einfach verkettete Liste mit all ihren Methoden gemacht. Nun sollen wir mittels Vererbung eine doppelt verkettete Liste machen. Und genau hier liegt mein Verständnisproblem.
Die Klasse Node schaut so aus:
Code:
public class Node {
    
    public Comparable data;				// content of the Node
    public Node next;					// pointer to next Node
    public Node(Comparable data) {		// constructor
        this.data = data;
        this.next = null;
    }
   
}

Die Klasse DoubleNode so:
Code:
public class DLNode extends Node{
	
	public Node prev;
	
    public DLNode(Comparable elem){
		super(elem);
		this.prev = null;
	}
	
}

Die Methode insert in LinkedList(einfach verkettet)

p
Code:
ublic class LinkedList implements MyList{
    
    protected int size = 0;	// size of the list, so that getSize() has O(1)
    protected Node head; // first node of the list
    protected Node tail; // last node of the list
    
    public LinkedList() { // dummy-element
    	head = new Node(null);
        tail = head;
    }
    
    //insert a node,whose element is val, after the node pos and return the added node
    protected Node insert(Node pos, Comparable val){
    	Node theNode = new Node(val);
    	theNode.next = pos.next;
    	pos.next = theNode;
    	size++;
    	
    	if(pos == tail){
    		tail = theNode;
    	}
   
    	return theNode;
    }
  }

Soweit noch alles klar aber jetzt kommts:
Code:
public class DoubleLinkedList extends LinkedList{

	protected int size = 0;	// size of the list, so that getSize() has O(1)
    protected DLNode head; // first node of the list
    protected DLNode tail; // last node of the list
    
    public DoubleLinkedList() { // dummy-element
    	super();
    }
    
    //insert a node,whose element is val, after the node pos and return the added node
    protected DLNode insert(DLNode pos, Comparable val){
    	DLNode temp = new DLNode(val);
    	
    	//always 4 pointer operations to add a node
    	temp.next = pos.next;
    	temp.next.prev = temp; ...ERROR 
         ...GEHT NICHT DA WENN ICH TEMP.NEXT EINGEBE ER GLAUBT 
         DER KNOTEN SEI VON DER KLASSE NODE UND ER SOMIT KEIN PREV MEHR KENNT. ICH MUSS
        ABER LEIDER DIE KLASSE "DLNode" SO LASSEN WIE ES IST DASS WAR ÜBUNGSVORGABE
    	
    	pos.next = temp;
    	temp.prev = pos;
    	size++;
    	
    	if(pos == tail){
    		tail = temp;
    	}
   
    	return temp;
    }


Was soll ich also tun?
mfg,
Reap
 
R

Reap

Gast
Hallo...danke...hätte mir auch selber einfallen können (aber dass sagt man immer später 8) )
Warum erkennt JAVA dass eigentlich nicht automatisch denn ich habe ja temp als DLNode deklariert also müsste es
ja wissen dass temp.next auch vom Typ DLNode sein wird.....wahrscheinlich weil ich next als Node deklariert habe...wenn ich next als DLNode deklariert hätte dann wäre es kein Problem dass er mir temp.next.prev akzeptiert.

Ich hab da noch eine Frage:
Wenn ich DLNode so umändere dass ich next auch als DLNode deklariere bleibt mir dann immer noch ein Node next
in meiner DLNode Klasse übrig? Wenn ja wpher weiß dann das Programm welches next es nehmen solll? Welches next nimmt dann der Konstruktor?

Code:
public class DLNode extends Node{
	
	public Comparable data;
         public DLNode next;
	public DLNode prev;
	
    public DLNode(Comparable elem){
		super(elem);
		this.prev = null;
	}
	
}

mfg,
Reap
 

messi

Bekanntes Mitglied
Reap hat gesagt.:
Warum erkennt JAVA dass eigentlich nicht automatisch denn ich habe ja temp als DLNode deklariert also müsste es ja wissen dass temp.next auch vom Typ DLNode sein wird.....wahrscheinlich weil ich next als Node deklariert habe...wenn ich next als DLNode deklariert hätte dann wäre es kein Problem dass er mir temp.next.prev akzeptiert.
Genau, aber das wäre schlechtes Design.

Reap hat gesagt.:
Wenn ich DLNode so umändere dass ich next auch als DLNode deklariere bleibt mir dann immer noch ein Node next in meiner DLNode Klasse übrig? Wenn ja wpher weiß dann das Programm welches next es nehmen solll? Welches next nimmt dann der Konstruktor?
DLNode.next "überschattet" dann Node.next. Ist aber auch wieder schlechtes Design, weil beide Felder erreichbar sind und du deshalb aufpassen musst, welches benutzt wird.
 
G

Guest

Gast
Hallo...danke für die Antwort...mittlerweile habe ich auch alle Methoden der DoubleLinkedList fertig.
Was mich aber stört ist dass ich so wenig Methoden von der LinkedList übernehmen kann...nicht einnmal den Konstruktor.....könnte man dass nicht irgendwie anders...geschickter machen?

Code:
public class DoubleLinkedList extends LinkedList{

    protected DLNode head; // first node of the list
    protected DLNode tail; // last node of the list
    
    public DoubleLinkedList() { // dummy-element
    	head = new DLNode(null);
        tail = head;
    }
    
    //insert a node,whose element is val, after the node pos and return the added node
    protected DLNode insert2(DLNode pos, Comparable val){
    	
    	DLNode temp = new DLNode(val);
    	temp.next = pos.next;
        
        if(temp.next != null){
        ( (DLNode) temp.next).prev = temp; 
        }
        
        pos.next = temp;
    	temp.prev = pos;
    	size++;
    	
    	if(pos == tail){
    		tail = temp;
    	}
   
    	return temp;
    }

.....usw. andere Methoden
}

insert 2 funktioniert nur wenn ich den Konstruktor neu schreibe und head und tail auch in DLNode umschreibe.
Is auch klar...aber gibt es nicht trotzdem irgendeinen Weg dass ich nicht den Konstruktor umändern muss?

Denn wenn ich ihn nicht umändere dann erstellt er mir einen einfachen Knoten von der Klasse Node und keinen DLNode...


mfg,
Hannes
 
B

Beni

Gast
Damit du möglichst viel von LinkedList übernehmen kannst, musst du LinkedList entsprechend aufbauen.
Ich kann dir mal ein Beispiel geben, wie ich das versucht hätte.

Zum die Knoten herstellen, gibts eine eigene Methode "createNode", die einfach "new Node" zurückgibt. Wenn man die überschreibt, kann man "new DNode" zurückgeben, und sofort verwendet die Liste nur noch DNodes.

Damit man add/insert/remove/etc... nicht neu erfinden muss, würde ich noch eine Methode einbauen, welche nur das Verbinden der Knoten übernimmt. Das Verbinden ist ja der einzige Schritt, bei dem sich die DoubleLinkedList wirklich total anders verhält, als die einfache LinkedList (das sind die Methoden de-/connect).

Code:
public class LinkedList {
	private Node head, tail;
	private int size = 0;
	
	public LinkedList(){
		// nix zu tun hier
	}
	
	// ein Knoten einfügen
	public void add( Object value ){
		if( size == 0 ){
			head = create( value );
			tail = head;
		}
		else{
			Node node = create( value );
			connect( tail, node, null );
			tail = node;
		}
		size++;
	}
	
	// Knoten an der Stelle index entfernen
	public void remove( int index ){
		if( size == 1 ){
			head = null;
			tail = null;
		}
		else{
			Node node = head;
			for( int i = 0; i+1 < index; i++ ){
				node = node.getNext();
			}
			
			Node head = node;
			Node remove = head.getNext();
			Node tail = remove.getNext();
			
			deconnect( head, remove, tail );
		}
		size--;
	}
	
	// Einen neuen Knoten herstellen
	protected Node create( Object value ){
		return new Node( value );
	}
	
	// Der Knoten "middle" irgendwie zwischen "head" und "tail" einbauen
	// (head und tail können null sein)
	// Vorher: head.getNext() == tail
	// Nachher: head.getNext() == middle && middle.getNext() == tail
	protected void connect( Node head, Node middle, Node tail ){
		if( head != null )
			head.setNext( middle );
		
		middle.setNext( tail );
	}
	
	// Den Knoten "middle", der zwischen "head" und "tail" ist, irgendwie
	// entfernen (head und tail können null sein).
	// Borher: head.getNext() == middle && middle.getNext() == tail
	// Nachher: head.getNext() == tail
	protected void deconnect( Node head, Node middle, Node tail ){
		if( head != null )
			head.setNext( tail );
	}
	
	// Die Knoten-Klasse, von der kann man einfach ableiten...
	protected static class Node{
		private Node next;
		private Object value;
		
		public Node( Object value ){
			this.value = value;
		}
		
		public Node getNext() {
			return next;
		}
		public void setNext( Node next ) {
			this.next = next;
		}
		public Object getValue() {
			return value;
		}
		public void setValue( Object value ) {
			this.value = value;
		}
	}
}


[Edit: "ICH MUSS ABER LEIDER DIE KLASSE "DLNode" SO LASSEN WIE ES IST DASS WAR ÜBUNGSVORGABE".
Arg... Sorry, hab mal wieder überlesen, dass ihr nicht selbst denken dürft. Na ich hoffe mal, dass du trotzdem mit meinem Geschreibsel was anfangen kannst. ]
 
R

Reap

Gast
Hallo...danke für die Antwort.

Ich hab aber ein Problem und zwar bei createNode()...Wenn ich jetzt createNode überschreiben will in meiner
DoublelinkedLst Klasse so schreibt er dass das nicht geht:

create in LinkedList()

Code:
// create a new node
    protected Node create( Comparable val ){ 
       return new Node(val); 
    }

Versuch create in DoubleLinkedList umzuschreiben

Code:
// create a new node
    protected DLNode create( Comparable val ){ 
       return new DLNode(val); 
    }


haut er mir einen Fehler raus da DLNode create nicht dasselbe ist wie Node create....ich kanns noch kompensieres
indem ich wieder einen typecast mache aber Code spare ich halt dann nur bedingt.

mfg,
Reap
 
B

Beni

Gast
Hm? Ich bekomme keine Probleme wenn ich sowas mache:
Code:
public class DLinkedList extends LinkedList{
	protected Node create( Object value ) {
		return new DNode( value );
	}
	
	protected void connect( Node arg0, Node arg1, Node arg2 ) {
		// ...
	}
	
	protected void deconnect( Node arg0, Node arg1, Node arg2 ) {
		// ...
	}
	
	protected static class DNode extends Node{
		private DNode previous;
		
		public DNode( Object value ){
			super( value );
		}

		public DNode getPrevious() {
			return previous;
		}

		public void setPrevious( DNode previous ) {
			this.previous = previous;
		}
		
		
	}
}
 
R

Reap

Gast
Ich aber leider schon.....


Code:
protected Node create( Object value ) { 
      return new DLNode( value ); 
   }

Wenn ich den Code hernehme muss ich erst wieder typecasten.....da wenn ich
DLNode a = create(Object) eingebe er mir sagt create(Object) müsse vom Typ
DLNode sein und nicht vom TypNode.

Wenn ich
Node a = create(Object) hernehme dann erzeugt er mir zwar einen Knoten aber er erkennt das prev
nicht.....gibts dafür überhaupt ne Lösung ohne dass ich am Knoten nicht etwas umändere?


Ich weiß dass return DLNode(value) bei der create Mehode nur geht weil jeder DLNode auch ein Node iist.
Also es muss in die Richtung gehen oder? Ich komm einfach nicht weiter...

mfg,
Reap
 
B

Beni

Gast
Ohne Cast kommst du bei dieser (leicht unsinnigen *hust*) Aufgabe nicht aus. Irgendwann musst du mal ein "(DLNode)node" einbauen (Es sei denn, du verwendest Generics, aber das ist ein anderes Thema).
 
R

Reap

Gast
Hallo...ok ich lass es einfach so wies ist.....es stimmt ja auch so wie is jetzt hab........
mfg,
Reap
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
V Array aus Klasse um vererbte Elemente erweitern Java Basics - Anfänger-Themen 3
N awt: vererbte Methode überschreiben Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
R Anfängerfrage zu Methoden in Vererbte Klassen Java Basics - Anfänger-Themen 2
M Vererbte Methoden "verbieten"? Java Basics - Anfänger-Themen 11
T Vererbte Klassen in Vector? Java Basics - Anfänger-Themen 8
D Liste schneller durchsuchen Java Basics - Anfänger-Themen 4
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
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
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
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
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
O ADT Liste z. B. Java Basics - Anfänger-Themen 15
B sortierte Liste Java Basics - Anfänger-Themen 4
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben