Hallo ich versuche eine Methode implementieren. Diese Methode soll die Liste, die mit dem in "head" übergebenen "ListNode"-Objekt beginnt, zu einem Ring schließen. Das heißt, der letzte Knoten der übergebenen Liste verweist auf den ersten Knoten der übergebenen Liste. Ich hab diese Code geschrieben aber passt etwas nicht und ich glaube ich hab den letzten Element der Liste nicht genau gefunden. Hat jemand eine Idee wie schaff ich das?? Danke!
Code:
public static void makeRing(ListNode head) {
int a = itemsCount(head);
ListNode headNode = (a > 0) ? new ListNode(0):null;
ListNode lastNode = headNode , nextNode;
for (int i = 1; i < a; i++) {
nextNode = new ListNode(i);
lastNode.successor = nextNode;
lastNode = nextNode;
}
}
Kannst du einmal die ganze Klasse posten, in der die makeRing()-Methode implementiert werden soll?
Was macht itemsCount(ListNode head); ?
Ansonsten das letzte Element findet man meistens indem man die Liste solange durchgeht bis man am Ende ist. Stichwort while();
Hier mal im pseudo-code:
Java:
first = liste.getFirst();
last = first;
next = first;while(next !=null){
last = next;
next = last.succesor;}
last.succesor = first;
public class ListNode {
private final int content;
private ListNode successor;
public ListNode(int content) {
this.content = content;
}
public int content() {
return content;
}
public void setSuccessor(ListNode node) {
successor = node;
}
public ListNode successor() {
return successor;
}
public static int itemsCount(ListNode head) {
int counter = 0;
if (head != null){
counter += itemsCount(head.successor);
counter++;
return counter;
}else{
return 0;
}
}
public static void makeRing(ListNode head) {
int a = itemsCount(head);
ListNode headNode = (a > 0) ? new ListNode(0):null;
ListNode lastNode = headNode , nextNode;
for (int i = 1; i < a; i++) {
nextNode = new ListNode(i);
lastNode.successor = nextNode;
lastNode = nextNode;
}
}
}
Hast du dir schon mal überlegt was deine Methode makeRing machen soll und dann damit verglichen was du programmiert hast?
Machst du irgendetwas mit der Liste die du bearbeiten willst? Kleiner Tipp: NEIN! Du erzeugst dir lauter neue Knoten und verknüpfst die dann miteinander. Denk noch mal drüber nach, wie man durch eine Liste iteriert...
Dein itemsCount() sieht leider auch nicht richtig aus falsch aus.
Java:
counter +=itemsCount(head.successor);
counter++;
Hier wird doppelt gezählt. Außerdem sorgt itemsCount() dazu, das du bei einem Ring eine Endlosschleife hättest. Da fehlt eine Abfrage in der Form this != head, was bei einer statischen Methode schwierig wird --> head.successor != head.
Edit: Muss itemsCount() rekusiv sein?
Edit2: Okay, itemsCount() funktioniert mit dem doppelt zählen, aber sieht natürlich verwirrend aus^^
publicstaticvoidmakeRing(ListNode head){ListNode next = head;ListNode last =null;while((next = next.successor)!=null){
last = next;}
last.successor = head;}
Das würde aber auch aus Teillisten, also wenn du erst bei zweiten Element makeRing() aufrufst, einen Ring machen und so wäre dann das erste Element nicht Teil des Rings.
Wie sieht denn eigentlich die genaue Aufgabenstellung aus?
Ich verstehe nicht warum ich die Aufgabe so kompliziere wenn die nicht so kompliziert sind aber trotzdem fehlt was. Was wenn head der einzige Element ist ?
Implementieren Sie die Methode void makeRing(ListNode head).Diese Methode soll die Liste, die mit dem in head übergebenen ListNode-Objekt beginnt, zu einem Ring schließen. Das heißt, der letzte Knoten der übergebenen Liste verweist auf den ersten Knoten der übergebenen Liste. Und der Code da oben.
Stimmt, da fehlt was, aber das kann man leicht verbessern.
Java:
publicstaticvoidmakeRing(ListNode head){ListNode next = head;ListNode last = head;// <-- hier war die Änderungwhile((next = next.successor)!=null){
last = next;}
last.successor = head;}