Circulaire LinkedList en Java
Je suis brossage sur mes structures de données par la lecture d'un livre et l'une des questions qu'il se pose est de construire une circulaire de la Seule Liste, en n'utilisant pas de "premier" & "dernier" des pointeurs, mais plutôt à permettre d'y accéder en utilisant une référence "actuel". Je ne suis pas sûr de comprendre la question, j'ai toujours pensé que j'avais besoin d'au moins le premier ou le dernier. Voici ma mise en œuvre, mais il a le "premier", pas sûr de la façon de les contourner. Pouvez-vous me dire comment je peux adapter mon code pour éliminer la dépendance?
class Link {
public int iData;
public Link next;
public Link(int id) { //constructor
iData = id;
}
public void displayLink() {
System.out.print(iData + " ");
}
} //end class Link
Alors voici la liste elle-même:
public class CircularLinkedList {
private Link first;
private Link current;
public Link getCurrent(){
return current;
}
public void setCurrent(int data){
}
public void advance(){
current = current.next;
}
public void insert(int data) {
Link newLink = new Link(data);
if (first == null) {
first = current = newLink;
} else {
current.next = newLink;
}
current = newLink;
newLink.next = first;
}
...
}
OriginalL'auteur sam2015 | 2015-04-22
Vous devez vous connecter pour publier un commentaire.
Si vous avez une liste chaînée circulaire, puis chacun des points de nœud au nœud suivant dans une boucle continue. Donc, il n'est pas le dernier et pas premier. Dans cette situation, vous avez seulement besoin d'un pointeur sur la structure des données (dont la question est d'appeler le "courant"), parce que vous pouvez marcher à l'ensemble de la liste jusqu'à ce que vous obtenez en retour à où vous avez commencé.
Un nœud peut ressembler à ceci:
Donc dans cet environnement, lorsque vous ajoutez votre premier nœud de la liste, c'est "à côté de" pointeur pointe vers lui-même. Lorsque vous ajoutez le deuxième nœud, chaque "côté" pointeur pointera à l'autre. Lorsque vous ajoutez le troisième nœud, puis ils vont en chaque point à l'autre, et sans doute c'est en cours de commande, d'une certaine façon. Chaque nœud supplémentaire sera ajouté à la bonne place dans la boucle.
Une bonne utilisation d'une structure de données comme celle-ci serait un calendrier qui obtient répétée tous les jours ou toutes les heures. Tous les événements peuvent être stockés dans une liste circulaire et le "en cours" pointeur pointe toujours à celle qui est prévue à côté.
Évidemment, lors de la recherche d'une liste comme cela, vous avez besoin de garder une référence vers le premier nœud. C'est la seule façon, vous pouvez savoir si vous avez effectué une recherche sur l'ensemble de la liste car elle ne prend pas fin avec un nul "à côté de" pointeur.
Edit: tel Que discuté dans le (vaste) commentaires ci-dessous, une "queue" pointeur semble être une très bonne idée pour les opérations d'insertion. Ici est la première méthode que j'ai posté, qui a été rebaptisée
insertAfter
:Un indicateur de queue serait toujours pointer vers le dernier noeud de la liste. Ce serait aussi le nœud avant le premier nœud, puisque la liste est circulaire. Donc, assurez-vous de maintenir
(tail.next == current)
lors de la manipulation des pointeurs. Voici la nouvelle méthode d'insertion:Insertion de valeurs doit, à juste titre, les mettre hors d'ordre. Pour maintenir l'ordre lors de l'ajout d'un
add
méthode doit être utilisée:Voici le code pour
advance
:Lorsqu'il est utilisé comme ceci permet de créer des listes...
...les deux listes sont ordonnées 1-2-3 avec le 1 comme actuelles.
Il sonne comme "en cours" peut être n'importe où comme il n'y a pas de "premier" nœud. Si la définition de données appelé pour un définitif "premier" nœud, alors il ne serait pas approprié d'utiliser une liste circulaire. Dans une circulaire de la liste chaînée, il est absurde d'utiliser des indices pour identifier les nœuds. Si vous appelez
deleteAt(2)
par exemple - qui est à 2 à partir d'où? Qu'est-ce que zéro?Pour une liste chaînée circulaire, toutes les méthodes qui effectuent des opérations sur un indice devez utiliser un indice par rapport à l'actuel "nœud". C'est parce que c'est le seul point d'entrée à la structure de données.
C'est précisément ce sur quoi me confondre, parce que ce que j'ai laissé de côté la question a été, il a également demandé que la liste doit également faire toutes les opérations normales, par exemple, trouver, supprimer, insérer..ect
Ces opérations devront être légèrement modifiée pour faire sens. Supprimer et Insérer des opérations serait la suppression et l'insertion, après le courant. Si vous essayez de supprimer le courant, vous aurez à marcher toute seule lié tableau qui est horriblement inefficace. Le même est vrai avec l'insertion d'avant.
OriginalL'auteur Erick Robertson
Utilisation
Node current, int currentIndex, int size
. Le dernier Nœud dunext
point pour le premier nœud de la liste (= circulaire). Avec l'index en cours, vous pouvez marcher (taille - 1) éléments pour atteindre le nœud précédent decurrent
.OriginalL'auteur Joop Eggen
Depuis la liste chaînée circulaire, il n'y aurait pas premier et le dernier élément.
Vous pouvez parcourir toute la liste à partir de n'importe quel nœud actuel (dans ce contexte).
Donc
Node
classe n'aurait qu'une référence suivante, etCircularLinkedList
aura seulement référence actuelle.Espère que cette aide.
Bonne chance.
OriginalL'auteur Tanmay Patil