Verständnisproblem_Verkettete Liste_JosephunsProblem

valentina2013

Bekanntes Mitglied
Hallo,

ich möchte eine Methode void addNode() implementieren, die einen neuen Knoten an das ende der Liste (eine zyklische verkettete Liste) hinzufügt.Der Wert des neuen Knotens muss ich durch Inkrementieren der Variable int capacity, welche gleichzeitig die Knotenanzahl representiert. und eine andere void Josephus(int k) die sukzessiv den k-ten Knoten im Kresi entfernt bis der Kreis leer ist
Java:
class Node {
	    
		private Node next;
		private int value;
		
		Node () {}
		
		Node (Node next, int value) {
			this.next  = next;
			this.value = value;		
		}
		
		
		public Node getNext() {
			return next;
		}
		
		public int getValue() {
			return value;
		}
		
		public void setNext(Node next) {
			this.next = next;
		}
		
		public void setValue(int value) {
			this.value = value;
		}
	}

dann noch die klasse mit den zu implementierenden Methoden
Java:
class CircularList {
	
	private Node head, tail;
	private int capacity;
	
	CircularList() {
		capacity = 0;
	}
	
	public boolean isEmpty() {
		return capacity == 0;
	}

			
			public void addNode() {
			    
			    // meine code
			Node head = new Node(tail, capacity++);    
					Node teil = new Node(head, capacity++);
					do{
						capacity++;
						Node newTile=new Node(head,capacity);//Erzeugt einen neuen Knoten für das Ende
						teil.setNext(newTile);//Erzeugt eine Referenz auf den neuen Knoten
						
					}while(capacity!=41);
			    }
				
				public void Josephus (int k) {
					
					Node iterator = head;
					Node predecessor = tail;
					
			        // meine code
				}
		
		 @Override
			public String toString() {

				String representation = "< circular list: ";
				
				Node iterator = head;
				
				for (int i = 0; i < capacity; i++) {
					representation += iterator.getValue()+" ";
					iterator = iterator.getNext();
				}
				
				return capacity == 0 ? "< empty circular list>" : representation+">"; 
			}	
			
		}

und letztendlich die klasse mit main
Java:
public class Josephus {

	public static void main(String args[]) {
		
		CircularList cl = new CircularList();
	
		for (int i = 0; i < 41; i++)
			cl.addNode();
		
		System.out.println(cl);
		
		cl.Josephus(3);
	}
}

Mein Problem: in main wird add 40 mal aufgerufen, wie kann ich add so implementieren dass beim jeden aufruf nur ein Knote angefügt wird?

Danke sehr :)
 

eMmiE

Bekanntes Mitglied
Ersetze das do-while (eine Schleife, die das solange immer wieder ausführt [DO] bis die Bedingung nicht mehr erfüllt ist [while]) durch ein if
Code:
if (capacity < 40) {
addNode();
}

Gruß eMmiE
 

valentina2013

Bekanntes Mitglied
ok,habe gemacht jetzt meckert er :
Exception in thread "main" java.lang.NullPointerException
CircularList.toString(CircularList.java:52)
at java.lang.String.valueOf(String.java:2854)
at java.io.PrintStream.println(PrintStream.java:821)
at Josephus.main(Josephus.java:14)
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Dann wird in CircularList irgendwas null sein, du versuchst aber trotzdem darauf zuzugreifen. Das passiert in Zeile 52 der Klasse CircularList.

Vermutlich ist
Code:
head
oder iterator.getNext() null.

Befüll die Liste mal und lass dir dann mit dem Debugger anzeigen, was überhaupt in der Liste gelandet ist.
Wie oft wird die for-Schleife durchlaufen?


BTW: Ich würde am Anfang von toString() auf eine leere Liste prüfen und ggf. "< empty circular list>" zurückgeben und erst danach in die for-Schleife gehen.
BTW2: Nur als Tipp. Ich weiß nicht, wie oft du ihn verwendest: Der Gebrauch des
Code:
?:
Operators ist mit äußerster Vorsicht zu genießen, da er den Code schnell unleserlich machen kann.
 

valentina2013

Bekanntes Mitglied
ja hattest absolut recht, jetzt bin ich soweit dass kein nullPointerException ausgegeben wird, dafür wird aber in addNode keine Knoten hinzugefügt sondern nur die values erhöht.eigentlich möchte ich dass am ende meine liste aus zyklisch verbundenne 41 knoten besteht.falls ihr mir helfen könnt wäre ich sehr dankbar
Java:
public void addNode() {

		head=new Node();//sonst nullPointerException
		tail=new Node();
		head.setNext(tail);
		head.setValue(capacity++);
		System.out.println(capacity+"******");
		tail.setNext(head);
		tail.setValue(capacity+1);
		
		Node newTail = new Node(head, capacity+1);// Erzeugt einen neuen Knoten
													// für das Ende
		tail.setNext(newTail);// Erzeugt eine Referenz auf den neuen Knoten
}
 
Zuletzt bearbeitet:

knilch

Bekanntes Mitglied
Hi,
Du hast in der addNode- Methode einen Denkfehler:
Java:
public void addNode() {
 
        head=new Node();//sonst nullPointerException
        tail=new Node();
        head.setNext(tail);
        head.setValue(capacity++);
        System.out.println(capacity+"******");
        tail.setNext(head);
        tail.setValue(capacity+1);
        
        Node newTail = new Node(head, capacity+1);// Erzeugt einen neuen Knoten
                                                    // für das Ende
        tail.setNext(newTail);// Erzeugt eine Referenz auf den neuen Knoten
}
Jedes mal wenn du einen node addest, dann erstellt du eine neue Instanz vom head und tail dies kann so nicht gehen.
Sie hier mal wie eine append- Methode von einer singleLinkedList aussehen könnte:
Diese nimmt die head- Instanz, die beim Initialisieren erstellt wurde. Dann wird innerhalb der append- Methode die head- Instanz updated:
Java:
private Node head;
private int nodeCounter;

/**
 * constructor to set the head element of list
 */
public CircularList() {
	head = new Node(0);
	head.setNext(null);
	nodeCounter = 0;
}
...
/**
 * Method to insert node at end of list
 * @param node
 */
public void append(Node node) {		
	Node lastNode = head;
	while (lastNode.getNext() != null) {
		lastNode = lastNode.getNext();		
	}
	lastNode.setNext(node);
	nodeCounter++;
}
Du musst dies nun so ändern, damit die append- Methode für die zirkuläre Liste funktioniert, also die tail- instanz muss auch noch geändert werden, (aber keine neue Instanz von tail erzeugen..) wenn der add gemacht wird.
 
Zuletzt bearbeitet:

valentina2013

Bekanntes Mitglied
danke für deine Antwort, ich komme immer noch nicht auf die richtige implementierung :(
wenn ich so was mache:
Java:
head.setNext(tail);
tail.setNext(head);
gibt wieder nullPointerException aus.
 

valentina2013

Bekanntes Mitglied
ja klar:
hier die exception:Exception in thread "main" java.lang.NullPointerException
at verkListe.CircularList.addNode(CircularList.java:20)
at verkListe.Josephus.main(Josephus.java:10)

Java:
class CircularList {
	
	private Node head, tail;
	private int capacity;
	
	CircularList() {
		capacity = 0;
	}
	
	public boolean isEmpty() {
		return capacity == 0;
	}

			
			public void addNode() {
			    
			    // meine code
				
				head.setNext(tail);//hier diese zeile wirft exception aus
				tail.setNext(head);
				
				
					
			    }
public void Josephus (int k) {
					
					Node iterator = head;
					Node predecessor = tail;
					
			        // meine code
				}
		
		 @Override
			public String toString() {

				String representation = "< circular list: ";
				
				Node iterator = head;
				
				for (int i = 0; i < capacity; i++) {
					representation += iterator.getValue()+" ";//und hier
					iterator = iterator.getNext();
				}
				
				return capacity == 0 ? "< empty circular list>" : representation+">"; 
			}	
			
		}
und hier main:
Java:
public class Josephus {

	public static void main(String args[]) {
		
		CircularList cl = new CircularList();
	
		for (int i = 0; i < 41; i++)
			cl.addNode();//und diese zeile wirft auch exception aus :(
		
		System.out.println(cl);
		
		cl.Josephus(3);
	}
}
 

knilch

Bekanntes Mitglied
Hi,
Ich denke die NPE kommt daher, weil tail und/oder head nicht initialisiert werden? Jedenfalls sehe ich es in deinem letzten post nicht.
Ich hab deine Klassen mal ein wenig geändert:
Node.java:
Java:
public class Node {
    private Node next;
    private int value;
   
    public Node (int value) {
    	this.value = value;
    }
   
    public Node getNext() {
        return next;
    }
   
    public int getValue() {
        return value;
    }
   
    public void setNext(Node next) {
        this.next = next;
    }
   
    public void setValue(int value) {
        this.value = value;
    }
}
CircularList.java:
Java:
package test2;

class CircularList {

	private Node head, tail;
	private int nodeCounter;

	public CircularList() {
	    head = new Node(0);
	    head.setNext(null);
	    nodeCounter = 0;
	    
	    tail = new Node(0);
	    tail.setNext(null);    
	}

	public boolean isEmpty() {
		return nodeCounter == 0;
	}

	public int size() {
		return nodeCounter;
	}

	 public void addNode() {       
         head.setNext(tail);//hier diese zeile wirft exception aus
         tail.setNext(head);
         }
	
	/**
	 * Method to insert node at end of list
	 * @param node
	 */
	public void append(Node node) {    
	    Node lastNode = head;
	    while (lastNode.getNext() != null) {
	        lastNode = lastNode.getNext();     
	    }
	    lastNode.setNext(node);
	    nodeCounter++;
	}

	public void Josephus (int k) {

		Node iterator = head;
		Node predecessor = tail;

		// meine code
	}

	@Override
	public String toString() {
		String representation = "< circular list: ";

		Node iterator = head;

		for (int i = 0; i < nodeCounter; i++) {
			representation += iterator.getValue()+" ";
			iterator = iterator.getNext();
		}
		return isEmpty() ? "< empty circular list>" : representation+">";
	}  
}
und Test.java
Java:
public class Test {
    public static void main(String args[]) {    
        CircularList cl = new CircularList();
        for (int i = 0; i < 41; i++) {
            cl.append(new Node(i));
        }
        System.out.println(cl);
       
        cl.Josephus(3);
    }
}
Nimm diese mal als Basis und ändere sie so, damit sie die Aufgabe lösen.

ps. die Methode addNode von dir hab ich mal als Beispiel durch append ersetzt. aber diese musst du noch anpassen damit die referenz von tail auch angepasst wird.
 
Zuletzt bearbeitet:

knilch

Bekanntes Mitglied
...ich kann der restcode leider nicht ändern, muss nur die beide methoden implementieren,
also nur die Methoden: public void addNode(){} und public void Josephus (int k){}.
Für addNode:
Java:
public void addNode() {    
   if(head == null) {
      head = new Node();
      head.setNext(null);
      head.setValue(0);
   }
   if(tail == null) {
      tail = new Node();
      tail.setValue(0);
   }
   tail.setNext(head);
   Node node = new Node();     
   Node lastNode = head;
   while (lastNode.getNext() != null) {
      lastNode = lastNode.getNext();   
      ...// hier musst du noch die tail- Instanz updaten 
   }
   node.setValue(capacity);
   node.setNext(tail);
   lastNode.setNext(node);
   nodeCounter++;
}
 
Zuletzt bearbeitet:

valentina2013

Bekanntes Mitglied
aktueller stand:(der imemer noch nicht richtig ist):
Java:
public void addNode() {

		// die code ist leider nicht richtig, denn ich verändere nur
		// die node.values,head und tail bleiben unverändert, war aber so
		// vorgesehen dass head.getValue()==1 sein musste und
		// tail.getValue()==41.
		// ich denke daher funktioniert die untere Methode auch nichtif (head == null) {// sonst nullPointerException da der Zeiger auf
							// "nichts" zeigt
			head = new Node();
			head.setNext(null);
			head.setValue(1);
		}
		if (tail == null) {
			tail = new Node();
			tail.setValue(1);
		}
		tail.setNext(head);
		Node node = new Node();
		Node lastNode = head;
		while (lastNode.getNext() != null) {// wird geprüft ob es zum aktuellen
											// lastNode einen nachfolger gibt
			lastNode = lastNode.getNext(); // wenn ja soll der aktuelle lastNode
											// auf seinen Nachfolger zeigen
			tail.setNext(lastNode);
		}
		lastNode.setNext(node);// wenn nein wird der Nachfolger des aktuellen
								// lastNodes auf den neuen Knoten
		// gesetzt,sprich die liste wird um einen Knoten erweitert
		node.setValue(capacity + 2);

		capacity++;
	}

	public void Josephus(int k) {

		Node iterator = head;
		Node predecessor = tail;

		while (capacity != 0) {
			for (int i = 0; i < k - 1; i++) {
				iterator = iterator.getNext();
				predecessor = predecessor.getNext();
			}
			predecessor.setNext((iterator.getNext()));
			iterator = iterator.getNext();
			capacity--;
		}
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Die while-Schleife mit der du versuchst vom letzten Knoten zum letzten zu iterieren kannst du dir sparen. In head hat der letzte Knoten zu stehen.

Wenn ich das richtig sehe, addest du in der addNode Methode 3 Knoten. tail wird ein Neuer, wenn head null ist, kommt da noch einer rein und dann wird noch einer hinten dran gehängt. Du müsstest die drei nur zu bestimmten Bedingungen adden und zwar so, dass immer nur einer geaddet wird. Z. B. mit einem else if Block.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Kleines GIT-Verständnisproblem zwischen zwei Rechnern Java Basics - Anfänger-Themen 6
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
nonickatall Grundsätzliches Verständnisproblem des Aufbaus eines Programms Java Basics - Anfänger-Themen 19
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Verständnisproblem mit Assoziationen Java Basics - Anfänger-Themen 7
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
A Erste Schritte Verständnisproblem Java Basics - Anfänger-Themen 5
S Verständnisproblem Aufgabe Java Basics - Anfänger-Themen 9
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
2 Verständnisproblem bei Anwendung von Lower Bounded Wildcards Java Basics - Anfänger-Themen 5
V Verständnisproblem Java Basics - Anfänger-Themen 22
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
J Verständnisproblem einer Methode Java Basics - Anfänger-Themen 20
M Konstruktur - Verständnisproblem Java Basics - Anfänger-Themen 4
C Postinkrement und println - Verständnisproblem Java Basics - Anfänger-Themen 8
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
N Verständnisproblem InsertionSort. Java Basics - Anfänger-Themen 2
D Verständnisproblem Java Basics - Anfänger-Themen 2
B VerständnisProblem mit Beispielaufgabe aus Buch Java Basics - Anfänger-Themen 1
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
V Verständnisproblem Java Basics - Anfänger-Themen 5
V Arrays-verständnisproblem Java Basics - Anfänger-Themen 4
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
P Verständnisproblem main Methode Java Basics - Anfänger-Themen 9
S Klassen Verständnisproblem Konstruktor Java Basics - Anfänger-Themen 7
I e.getMessage(); - Verständnisproblem Java Basics - Anfänger-Themen 6
lesni Vererbung Vererbung - Verständnisproblem Java Basics - Anfänger-Themen 2
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
J Verständnisproblem Methoden-Kettung Java Basics - Anfänger-Themen 3
A Vererbung Verständnisproblem bei Übung Java Basics - Anfänger-Themen 5
E Verständnisproblem Typkonvertierung Java Basics - Anfänger-Themen 4
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Array Verständnisproblem Java Basics - Anfänger-Themen 3
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
L Eclipse verlangt "{" nach ";"... Verständnisproblem Java Basics - Anfänger-Themen 5
D charAt(i) verständnisproblem Java Basics - Anfänger-Themen 4
D Verständnisproblem Marken und Schleifen Java Basics - Anfänger-Themen 19
M Verständnisproblem bei Ternären Operanten bzw. Bedingungsoperator Java Basics - Anfänger-Themen 8
T Datentypen Verständnisproblem mit main Methode Java Basics - Anfänger-Themen 3
M Verständnisproblem Threads Java Basics - Anfänger-Themen 7
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
G Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8
A Postinkrement-Verständnisproblem Java Basics - Anfänger-Themen 12
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
B Verständnisproblem bei Vererbung Java Basics - Anfänger-Themen 3
W generisches Programmieren - Verständnisproblem Java Basics - Anfänger-Themen 4
A Verständnisproblem Nr 2 Java Basics - Anfänger-Themen 14
A Verständnisproblem Java Basics - Anfänger-Themen 6
A Array Verständnisproblem Java Basics - Anfänger-Themen 8
G Verständnisproblem --> JTree Java Basics - Anfänger-Themen 6
M Verständnisproblem mit der Klasse Thread Java Basics - Anfänger-Themen 10
N BufferedReader Verständnisproblem Java Basics - Anfänger-Themen 12
G Verständnisproblem: Code kompelieren und interpretieren Java Basics - Anfänger-Themen 3
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
G Verständnisproblem Serverinput einlesen. Java Basics - Anfänger-Themen 4
J Array und Schleifen Verständnisproblem Java Basics - Anfänger-Themen 25
G Verständnisproblem Java Basics - Anfänger-Themen 4
N Verständnisproblem: Mehrere Objekte einer Klasse erstellen Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
V Verständnisproblem mit Abstrakten zu Konkreten Klassen Java Basics - Anfänger-Themen 7
A Problem mit der Stringgrösse, bzw Verständnisproblem? Java Basics - Anfänger-Themen 14
A Verständnisproblem mit ScrollPanel Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
T Verständnisproblem mit equals() Java Basics - Anfänger-Themen 4
N datei byte für byte auslesen (verständnisproblem) Java Basics - Anfänger-Themen 2
T Verständnisproblem packages/import Java Basics - Anfänger-Themen 9
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
D Verständnisproblem Java Basics - Anfänger-Themen 6
S for Schleifen: Verständnisproblem Java Basics - Anfänger-Themen 15
T Vererbung von Attributen und Methoden, Verständnisproblem Java Basics - Anfänger-Themen 4
bernd while-Schleife: Verständnisproblem Java Basics - Anfänger-Themen 7
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
G GridBagLayout: Verständnisproblem Java Basics - Anfänger-Themen 5
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
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
V einfach verkettete Listen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben