La création d'une classe LinkedList à partir de zéro
Nous a donné une mission à créer une LinkedList à partir de zéro, et il n'y a absolument pas de lectures donné pour nous guider sur ce migrane causant la tâche. Aussi tout ce qui est en ligne semble juste de l'utilisation de Java est intégré dans LinkedList des méthodes et des trucs. De toute façon, les listes liées parfait de sens lors de l'utilisation de Java par défaut de choses, mais de la créer à partir de zéro n'a pas de sens que ce soit. Disons que j'ai
public class LinkedList {
private LinkedList next;
private final String word;
//constructor
public LinkedList(String word, LinkedList next) {
this.word = word;
this.next = next;
}
Et ainsi, comme par magie, nous avons une liste liée. Ce qui se passe? Comment ai-je créé une liste liée de ce genre? Comment cela fonctionne? Je suis censé écrire une méthode append ajoute une donnée String word
paramètre à la fin de this
linkedlist. J'ai essayé de regarder le addLast méthode intégrée pour construite en java linkedlist classe, mais c'est pas pour moi, que je ne comprends pas ce qui se passe. Quelqu'un veut bien m'aider 🙂
Vous devez vous connecter pour publier un commentaire.
Si vous êtes réellement à la construction d'un système réel, alors oui, vous devez généralement utiliser juste les trucs de la bibliothèque standard, si ce que vous avez besoin est disponible. Cela dit, ne pas penser à cela comme inutile. Il est bon de comprendre comment les choses fonctionnent, et la compréhension des listes liées est une étape importante vers la compréhension plus complexe des structures de données, dont beaucoup n'existent pas dans les bibliothèques standard.
Il y a quelques différences entre la façon dont vous êtes en train de créer une liste, et la manière dont les collections Java API t-il. Les Collections de l'API est en train d'essayer d'adhérer à une plus compliqué de l'interface. Les Collections de l'API liste chaînée est aussi une liste doublement chaînée, alors que vous êtes en train de construire une seule liste liée. Ce que vous faites est plus approprié pour un devoir en classe.
Avec votre
LinkedList
classe, une instance sera toujours une liste d'au moins un élément. Avec ce type d'installation que vous souhaitez utilisernull
pour quand vous avez besoin d'une liste vide.Pense
next
comme étant "le reste de la liste". En fait, beaucoup de semblables utiliser le nom de "queue" au lieu de "suivant".Voici un schéma d'un
LinkedList
contenant 3 éléments:Noter que c'est un
LinkedList
objet de pointage à un mot ("Bonjour") et une liste de 2 éléments. La liste de 2 éléments a un mot ("Stack") et une liste de 1 élément. Cette liste de 1 élément a d'un mot ("Overflow") et une liste vide (null
). Vous pouvez donc traiternext
comme une autre liste qui se trouve être l'un des éléments les plus courtes.Vous voudrez peut-être ajouter un autre constructeur qui prend juste une Chaîne de caractères, et de jeux à côté de
null
. Ce serait pour la création d'un 1-élément de la liste.À ajouter, vous vérifiez si
next
estnull
. Si il est, créer une nouvelle liste d'éléments et de définirnext
pour que.Si le prochain n'est pas
null
, puis ajouter ànext
à la place.C'est l'approche récursive, qui est le montant minimum de code. Vous pouvez le transformer en un processus itératif de la solution qui serait la plus efficace en Java*, et ne serait pas le risque d'un débordement de la pile avec de très longues listes, mais je devine que le niveau de complexité n'est pas nécessaire pour la durée de votre affectation.
* Certaines langues ont la queue appel à l'élimination, qui est une optimisation qui permet à la langue de mise en œuvre de convertir en "queue d'appels" (un appel à une autre fonction comme la dernière étape avant le retour) en (efficacement) un "goto". Cela rend le code d'éviter complètement à l'aide de la pile, ce qui le rend plus sûr (vous ne pouvez pas le débordement de la pile si vous n'utilisez pas la pile) et généralement plus efficace. Le schéma est probablement le plus bien connu l'exemple d'une langue à l'aide de cette fonctionnalité.
next.next==null
, alors cela signifie que la prochaine n'était pasnull
. Si vous appeleznext.append(word)
. Maintenant, nous sommes dans ce qui-a-éténext
'sappend
méthode. Donc, ce que nous appelons maintenantthis
est ce que nous étions déjà à l'appel denext
. Nous regardonsnext
(que nous avons précédemment aurait appelénext.next
), et c'estnull
, nous avons donc mis ennext = new LinkedList(word)
.Ce que vous avez codé n'est pas un LinkedList, à moins pas un de ceux que je reconnais. Pour cette mission, vous souhaitez créer deux classes:
Un
LinkNode
a un membre de champ pour les données qu'elle contient, et unLinkNode
référence à la prochaineLinkNode
dans leLinkedList
. Oui, c'est un auto-référentielle de la structure de données. UnLinkedList
a juste un spécialLinkNode
fait référence au premier élément de la liste.Lorsque vous ajoutez un article dans le
LinkedList
, vous traversez tous lesLinkNode's
jusqu'à ce que vous atteignez le dernier. CetteLinkNode's
suivante doit être null. Ensuite, vous construire une nouvelleLinkNode
là, c'est de la valeur, et l'ajouter à laLinkedList
.Comment sur un entièrement fonctionnel de la mise en œuvre d'un non-récursive Liste chaînée?
J'ai créé pour mon Algorithmes j'ai la classe comme un tremplin pour mieux comprendre avant de passer à l'écriture d'un doublement lié classe de file d'attente pour une mission.
Voici le code:
Note: C'est une jolie base de la mise en œuvre d'un seul-liste liée. Le " T " de type est un type générique de l'espace réservé. En fait, cette liste devrait fonctionner avec n'importe quel type qui hérite de l'Objet. Si vous l'utilisez pour les types primitifs assurez-vous d'utiliser la classe nullable équivalents (ex 'Integer' pour l'int type). La "dernière" de la variable n'est pas vraiment nécessaire, sauf qu'il raccourcit les insertions de O(1) fois. Les absorptions sont très lents, car ils s'exécuter en O(N) le temps, mais il permet de supprimer la première occurrence d'une valeur dans la liste.
Si vous le souhaitez, vous pouvez aussi consulter dans la mise en œuvre:
Honnêtement, il ne prend que quelques lignes de code pour faire une liste à double liaison. La principale différence entre cela et une double liaison-liste, c'est que le Nœud cas d'une liste à double liaison besoin d'un surplus de référence qui pointe vers l'élément précédent dans la liste.
L'avantage de cette de plus un appel récursif à la mise en œuvre est que c'est plus rapide et vous n'avez pas à vous inquiéter au sujet de l'inondation de la pile lorsque vous traverser de grandes listes.
Il y a 3 commandes pour tester cela dans le débogueur/console:
Si vous n'avez jamais vu de l'intérieur comment l'une de ces œuvres, je vous suggère de parcourir les différentes dans le débogueur:
Alors qu'il y a de mieux et de plus efficace approches pour les listes de type array-listes, la compréhension de la façon dont l'application traverse via références/pointeurs est essentielle pour comprendre comment beaucoup plus de données au niveau des structures de travail.
Conseil 1: lire la description de listes liées à http://en.wikipedia.org/wiki/Linked_list
Conseil 2: la Java de la mise en œuvre de la LinkedList est une liste doublement chaînée. La vôtre, est une seule liste liée. Les algorithmes ne s'appliquent pas directement.
Aussi:
Cela dépend de ce que les résultats requis de faire le travail. Si l'objectif est de produire du code qui répond à certains fonctionnelle /les exigences non-fonctionnelles, alors vous avez raison. Si le réel but est de vous apprendre comment programme /conception Api /mettre en œuvre non négligeable de structures de données, alors l'utilité du produit final est presque totalement hors de propos.
Ce que vous avez réellement il y est un ouvert de type de données, qui pourraient être utilisés pour construire une (sorte de) liste. Mais ce n'est pas ce que le professeur veut. Et il n'aurait certainement pas être considéré comme un utile liste d'abstraction. Utile abstraction seraient les suivantes:
méthodes pour faire les choses que les programmeurs ne veulent pas avoir à les répéter plus et plus de nouveau, et
une couche d'abstraction qui arrête les programmeurs de "casser" la liste; par exemple, par mégarde, créant un cycle, ou accidentellement couture une sous-liste en deux listes pour créer un arbre inversé.
Sûr, une Liste chaînée est un peu déroutant pour la programmation des n00bs, beaucoup, la tentation est de le regarder comme des Poupées russes, parce que c'est ce qu'il semble, une LinkedList Objet dans une LinkedList Objet. Mais c'est une touche difficile à visualiser, au lieu de le regarder comme un ordinateur.
LinkedList = Données + Membres Suivant
Où il est le dernier membre de la liste si la prochaine est NULL
Donc 5 membres LinkedList serait:
LinkedList(Data1, LinkedList(Data2, LinkedList(Data3, LinkedList(Données4, LinkedList(Data5, NULL)))))
Mais vous pouvez la considérer comme simplement:
Data1 -> Données2 -> Data3 -> Data4 -> Data5 -> NULL
Alors, comment pouvons-nous trouver la fin de cette? Eh bien, nous savons que la valeur NULL est la fin donc:
C'est très simple code de cours, et il sera infiniment boucle si vous lui donnez une liste chaînée circulaire! Mais c'est l'essentiel.
Liste liée à démontrer Insérer à l'Avant, de Supprimer l'Avant, Insérer à l'Arrière et de Supprimer l'Arrière des opérations en Java:
Comment ai-je créé une linkedlist comme ça. Comment cela fonctionne?
Tout ceci est une liste chaînée est. Un article avec un lien vers l'élément suivant de la liste. Tant que vous gardez une référence à l'élément au début de la liste, vous pouvez parcourir l'ensemble de la chose à l'aide de chaque référence ultérieure à la valeur suivante.
À ajouter, tout ce que vous devez faire est de trouver la fin de la liste, et faire le prochain élément de la valeur ajoutée, donc, si cette non nulle suivant, vous devez appeler ajouter sur l'élément suivant jusqu'à ce que vous trouver la fin de la liste.
next == null
et définirnext = new LinkedList(word, null);
sur cet objet.if (next==null)
?next.Append(word);
qui est un appel récursif (appel d'Ajouter d'Ajouter).Veuillez lire cet article: Comment mettre en Œuvre une LinkedList Classe à Partir de Zéro En Java
Sortie