Je voudrais créer une liste liée circulaire / cyclique lorsque la queue de la liste rapporterait la tête de la liste. Alors puis-je utiliser Si je ne peux pas utiliser Faites-moi savoir si vous avez besoin de plus de détails et je vais éclaircir toute confusion. P> java.util.linkedlist code> et modifier le nœud queue après la création de la liste pour la rendre circulaire / cyclique? Si oui, pouvez-vous me montrer du code sur la manière dont cela se produirait? P>
java.util.linkedlist code>, comment créer ma propre liste de liste liée à la circulaire / cyclique? Pouvez-vous me montrer les squelettes de la façon dont cette implémentation serait regarder? P>
3 Réponses :
Java.Util.LinkedList est l'un des types de données de collections. Le but des collections est de fournir des structures de services publics et ne gênant pas le programmeur à s'inquiéter de leur mise en œuvre interne. Si vous devez em> avoir des internes qui fonctionnent d'une certaine manière, et les Java.Utils ne garantissent pas que c'est comment ils fonctionnent, ils ne sont donc pas pour vous. Pour mettre en œuvre une liste liée à la circulaire , d'abord créer une classe ListNode: p> puis stocke une tête listnode code> et assurez-vous que prev code> de
de
Tête Code> Points à la "fin" de la liste et
Suivant code> de "extrémité" Retour à
tête code>. Honnêtement, cependant, il y a peu de différence entre une liste liée bidirectionnelle, gardant un pointeur de queue et une liste liée circulaire. P> p>
Je n'ai pas besoin d'une liste liée "bidirectionnelle", donc pas besoin de listnode prev code>. Mais merci pour votre suggestion. Je vais essayer.
class ListNode { public ListNode next; public Object data; public ListNode(Object data, ListNode next) { this.next = next; this.data = data; } } class CircularLinkedList { private ListNode head = null; private int numberOfElements = 0; private ListNode actualElement = null; private int index = 0; public boolean isEmpty() { return (numberOfElements == 0); } public int getNumberOfElements() { return numberOfElements; } public void insertFirst(Object data) { if (!(isEmpty())) { index++; } ListNode listNode = new ListNode(data, head); head = listNode; numberOfElements++; } public void insertAfterActual(Object data) { ListNode listNode = new ListNode(data, actualElement.next); actualElement.next = listNode; numberOfElements++; } public boolean deleteFirst() { if (isEmpty()) return false; if (index > 0) index--; head = head.next; numberOfElements--; return true; } public boolean deleteActualElement() { if (index > 0) { numberOfElements--; index--; ListNode listNode = head; while (listNode.next.equals(actualElement) == false) listNode = listNode.next; listNode.next = actualElement.next; actualElement = listNode; return true; } else { actualElement = head.next; index = 0; return deleteFirst(); } } public boolean goToNextElement() { if (isEmpty()) return false; index = (index + 1) % numberOfElements; if (index == 0) actualElement = head; else actualElement = actualElement.next; return true; } public Object getActualElementData() { return actualElement.data; } public void setActualElementData(Object data) { actualElement.data = data; } }
Il y avait deux bugs mineurs dans la méthode de suppression de la suppression, je leur ai corrigé.
Pour une application pratique (par exemple non seulement en train de jouer ou d'apprendre), je préférerais personnellement la méthode itérables de Guava's CODE> - voir
itérables.cycle p>
P>
Pourquoi voudriez-vous une liste liée circulaire?
Je veux juste jouer avec faire un. Pas de vraie raison sauf moi. Je n'ai pas vu de nombreuses implémentations de cette en ligne et je veux juste essayer.
@Puddingfox: une liste circulaire est utile pour l'accès rond-robin d'une collection (par exemple pour équilibrage de charge)
@ user359996: utilise une liste circulaire pour la ronde robine juste une bonne pratique de programmation? Je comprends que «rond 'et« circulaire »vont ensemble, mais y a-t-il d'autres raisons d'utiliser une liste circulaire sur une liste de matrices?
La manière dont la liste circulaire est mise en œuvre n'est pas super importante. À votre propos, j'utiliserai personnellement une arraylist puis envelopperiez-le avec docs.guava-libries.git-history/release/java doc / ... . Edit: Apparemment, c'est même une des réponses que quelqu'un a donné ...