Vous actuellement ajoutez un élément puis appel à la récursion sur elle, se terminant à sans cesse ajouter des éléments.
Vous avez besoin soit à des éléments derrière votre récursion lors du traitement dans un sens avant ou après la récursion lors du traitement en arrière.
Créons une version en arrière. Nous marchons d'abord récursivement jusqu'à la fin de la liste, puis résolvons la récursion en arrière, en ajoutant les éléments après à chaque fois notre élément actuel.
public <E> void duplicateEntries(MyLinkedList<E> list) {
// Do nothing if list is empty
if (list.size() != 0) {
// Call the recursive method on the head node
duplicateEntriesHelper(list.head);
}
}
public <E> void duplicateEntriesHelper(Node<E> node) {
// Walk to the end of the list
if (node.next != null) {
duplicateEntriesHelper(node.next);
}
// Resolve recursion, duplicate current
// entry by inserting it after the current element
Node<E> duplicatedEntry = new Node<>();
duplicatedEntry.data = node.data;
// Insert element after current node
duplicatedEntry.next = node.next;
node.next = duplicatedEntry;
}
Les classes I utilisées devrait ressembler à:
public class MyLinkedList<E> {
public Node<E> head = null;
@Override
public String toString() {
// Build something like "MyLinkedList[2, 3, 4]"
StringBuilder sb = new StringBuilder();
sb.append("MyLinkedList[");
StringJoiner sj = new StringJoiner(",");
Node<E> node = head;
while (node != null) {
sj.add(node);
node = node.next;
}
sb.append(sj);
sb.append("]");
return sb.toString();
}
}
public class Node<E> {
public Node next = null;
public E data = null;
@Override
public String toString() {
return E;
}
}
Et voici la démonstration:
public static void main(String[] args) {
// Setup the list
MyLinkedList<Integer> list = new MyLinkedList<>();
Node<Integer> first = new Node<>();
first.data = 2;
Node<Integer> second = new Node<>();
second.data = 3;
Node<Integer> third = new Node<>();
third.data = 4;
list.head = data;
first.next = second;
second.next = third;
// Demonstrate the method
System.out.println("Before: " + list);
duplicateEntries(list);
System.out.println("After: " + list);
}
Bien sûr, vous pouvez ajouter des méthodes et des fonctionnalités supplémentaires pour les . Par exemple en utilisant certains constructeurs ou getter/setter méthodes.
Pourquoi votre méthode ne fonctionne-t-elle pas? Que fait-il avec votre exemple d'entrée? S'il vous plaît ne supposez pas que nous courons votre code et passons des heures à trouver les bugs pour vous. S'il vous plaît, aidez-nous un peu, fournissez autant d'informations que possible. La procédure générale devrait consister à parcourir récursivement toute la liste, puis pour chaque élément, insérer le même élément après celui en cours. Les deux parties devraient être relativement faciles à mettre en œuvre. Vous devez d'abord implémenter une méthode ** insert ** fonctionnant. Aussi, pourquoi vos éléments de liste de type 'MyList'? Ne devriez-vous pas avoir deux classes 'List' et' Element'? – Zabuza
Si vous continuez d'ajouter des éléments à la liste, vous n'irez jamais à la fin. Donc, au lieu de travailler à partir de la fin de la liste au début. Donc, je voudrais créer une liste de liens doubles et ajouter MyList précédent. – jdweng
Regardez, je suis complètement nouveau à ce sujet et je n'ai pas beaucoup de pratique avec la récursivité ou Java, vous n'avez pas besoin d'être impoli. Content que ce soit facile à mettre en œuvre. J'ai posé la question pour que quelqu'un puisse m'expliquer comment l'appliquer. – Laura