Je travaille sur un projet Java pour une classe depuis un moment maintenant. C'est une implémentation d'une liste chaînée (appelée ici AddressList
, contenant des nœuds simples appelés ListNode
). Le hic, c'est que tout devrait être fait avec des algorithmes récursifs. J'ai pu tout faire sans une seule méthode:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
À l'heure actuelle, ma reverse
fonction appelle simplement une fonction d'assistance qui prend un argument pour autoriser la récursivité.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Avec ma fonction d'assistance ayant la signature de private ListNode reverse(ListNode current)
.
Pour le moment, je le fais fonctionner de manière itérative en utilisant une pile, mais ce n'est pas ce que la spécification exige. J'avais trouvé un algorithme en C qui l'inversait de manière récursive et le convertissait manuellement en code Java, et cela fonctionnait, mais je ne l'avais pas compris.
Edit: Nevermind, je l'ai compris entre-temps.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Pendant que je suis ici, est-ce que quelqu'un voit des problèmes avec cet itinéraire?
la source
Réponses:
Il y a du code dans une réponse qui l'explique, mais vous trouverez peut-être plus facile de commencer de bas en haut, en posant et en répondant à de petites questions (c'est l'approche de The Little Lisper):
la source
On m'a posé cette question lors d'une interview et j'ai été contrariée de l'avoir tâtonnée car j'étais un peu nerveuse.
Cela devrait inverser une liste liée, appelée avec reverse (head, NULL); donc si c'était votre liste:
edit: ive fait comme 6 modifications à ce sujet, montrant que c'est encore un peu délicat pour moi lol
la source
Je suis arrivé à mi-chemin (jusqu'à null, et un nœud comme suggéré par plinth), mais j'ai perdu la trace après avoir fait un appel récursif. Cependant, après avoir lu l'article par socle, voici ce que j'ai trouvé:
la source
Voici encore une autre solution récursive. Il a moins de code dans la fonction récursive que certains des autres, donc cela pourrait être un peu plus rapide. C'est C # mais je pense que Java serait très similaire.
la source
L'algo devra travailler sur le modèle suivant,
Structure:
Code:
Production:
la source
Je pense que c'est une solution plus propre, qui ressemble à LISP
la source
Je sais que c'est un ancien post, mais la plupart des réponses ne sont pas récursives à la queue, c'est-à-dire qu'elles effectuent certaines opérations après le retour de l'appel récursif, et donc pas les plus efficaces.
Voici une version récursive de queue:
Appeler avec:
la source
la source
la source
la source
la source
Inverser par algo récursif.
Par itératif
la source
Cette solution démontre qu'aucun argument n'est requis.
Voici le code de support, pour démontrer que cela fonctionne:
la source
Voici une approche itérative simple:
Et voici une approche récursive:
la source
Comme Java est toujours pass-par-valeur, pour inverser récursivement une liste chaînée en Java, assurez-vous de renvoyer la "nouvelle tête" (le nœud principal après la réversion) à la fin de la récursivité.
la source
PointZeroTwo a une réponse élégante et la même chose en Java ...
la source
la source
appel en utilisant: head = reverseRec (null, head);
la source
Ce que les autres gars ont fait, dans un autre article, c'est un jeu de contenu, ce que j'ai fait est un jeu de liste liée, cela inverse le membre de LinkedList et non l'inverse d'une valeur de membres.
la source
la source
La solution est:
}
la source
la source
la source
la source
la source
Inspiré par un article sur les implémentations immuables de structures de données récursives, j'ai mis en place une solution alternative en utilisant Swift.
La principale solution de documents de réponse en mettant en évidence les sujets suivants:
Je les ai appelés le cas échéant dans la solution ci-dessous.
la source
Inverser la liste liée à l'aide de la récursivité. L'idée est d'ajuster les liens en inversant les liens.
la source
la source
la source
Voici une référence si quelqu'un recherche une implémentation Scala:
la source