2010-11-29 5 views
0

Je tente d'écrire une classe java CircularList qui contient le nœud habituelle classe interne et les variables d'instance:Programmation Java - Circulaire LinkedList

+2

Ce coutures comme un travail à domicile .. ai-je suppose que cela? –

+0

Salut étudiant! Plz essayer quelque chose et quand vous atteignez un point où vous êtes coincé, nous pouvons vous pousser un peu.Imo regarde les premières diapositives de la conférence et les premiers exercices de vos travaux pratiques en laboratoire. – Muggen

+2

les gens seront prêts à vous aider si vous leur montrez ce que vous avez essayé jusqu'à présent. – Naveen

Répondre

0

Conseil ... liste circulaire devrait avoir suivant et précédent au lieu de premier et dernier. La logique compte

+0

Merci beaucoup. – user508833

2

OK, je ne vais pas vous donner l'implémentation complète de la classe, mais je vais vous donner quelques conseils.

  1. Vous n'avez pas besoin de contenir une référence au dernier élément. Placez une référence précédente et suivante à vos nœuds et votre dernier nœud sera le premier.Prev
  2. Outre le fait que les listes circulaires n'ont pas de fin, ils sont tout à fait les mêmes que les listes régulières, mais où vous trouvez le dernier élément comme celui-ci :

    Nœud tmp = premier;

    while (tmp.Next! = Null) tmp = tmp.Next;

Dans une liste circulaire, l'idée est comme ceci:

Node tmp = first; 

while (tmp.Next != first) 
    tmp = tmp.Next; 

Parce que vous ne trouverez jamais un nœud pointant vers nulle, sauf si la liste est vide. Un dernier conseil, si vous avez besoin de mettre en œuvre un indexeur, rappelez-vous que dans une liste circulaire il n'y a pas une telle chose que l'indice hors de portée, car

list[count] = list[0] = list[count * k] 

Gardez cela à l'esprit, donc le calcul de votre index pour ces méthodes peuvent être assez difficile. Pour les index positifs, l'idée principale est:

index = index % count; 

Pour les négatifs, c'est légèrement différent. J'espère pouvoir vous aider avec mes mots. Si vous voulez une mise en œuvre, je crois qu'il devrait y avoir quelques-uns si vous demandez poliment à Google :)

Bonne chance!

+0

Merci beaucoup – user508833

+0

Bonjour, J'ai ajouté le programme que j'ai conçu et j'ai besoin d'aide supplémentaire. Merci – user508833

+0

Pourriez-vous me regarder s'il vous plaît? – user508833

2

Je ne sais pas quel est votre problème, vous semblez avoir tout ce dont vous avez besoin. La seule différence entre cette liste liée et une normale serait d'ajouter à la fin.

Dans une liste liée régulière, vous créez un nouveau noeud et définissez le dernier élément sur ce noeud. Dans ce cas, vous changez le pointeur dans le • Dernier nœud pour pointer vers le nouveau nœud, et faites pointer le nouveau nœud sur • Premier.

La suppression fonctionne de la même manière qu'une liste chaînée normale. Chaque fois que vous voulez supprimer un nœud, vous trouvez quel autre nœud pointe vers celui-ci (soit en précédent, soit en supprimant le premier, vérifiez • Dernier) et faites le pointer vers l'endroit où le nœud en cours de suppression pointait.

Si cela ne résout pas votre problème, faites le moi savoir et je vais essayer de vous aider.

Juste quelqu'un a déjà remarqué demandé exactement la même question: Can I use java.util.LinkedList to construct a circular/cyclic linked list?

+0

Salut, j'ai ajouté le programme que j'ai trouvé et j'ai besoin d'aide supplémentaire. Merci – user508833

+0

Tout d'abord, je crois que vous avez une erreur dans removeLast(): En faisant current.setNextNode (..) à l'intérieur de la boucle while, chaque noeud pointe vers le premier. Vous voulez l'avoir en dehors du moment, donc seul le pointeur du second dernier nœud est changé. Pour la question, vous appelez simplement removeByPosition() avec p comme argument. Changez cette fonction pour définir tail = current.getNextNode() à la fin. Puis continuez à l'appeler avec p comme argument jusqu'à ce qu'il ne reste plus qu'un seul noeud. – Zepee

+0

Pourriez-vous s'il vous plaît regarder cela pour moi? – user508833

0
class Node { 
    int value; 
    Node next; 
    Node prev; 
    Node(int initialValue) { 
     value = initialValue; 
     next = null; 
     prev = null; 
    } 
    public int getValue() { 
     return this.value; 
    } 
} 

class NodeList { 
    Node pointer; 
    NodeList() { 
     pointer = null; 
    } 
    public void insertNode(int nodeValue) { 
     Node newNode = new Node(nodeValue); 
     if(pointer == null) { 
      newNode.next = newNode; 
      newNode.prev = newNode; 
     }else if(pointer.next == null && pointer.prev == null && pointer != null) { 
      newNode.next = pointer; 
      newNode.prev = pointer; 
      pointer.prev = newNode; 
      pointer.next = newNode; 
     } 
     else if(pointer != null) { 
      newNode.next = pointer.next; 
      newNode.prev = pointer; 
      pointer.next.prev = newNode; 
      pointer.next = newNode; 
     } 
     pointer = newNode; 
     System.out.println(“Successfully inserted : ” + pointer.getValue()); 
    } 
    public void printRing(boolean direction) { 
     Node tempNode = pointer; 
     do { 
      System.out.println(“Value = ” + tempNode.getValue()); 
      tempNode = direction ? tempNode.next : tempNode.prev; 
     } while(tempNode.value != pointer.value);  
    }  
}