Je sais comment créer le lien J'ai déjà lu la réponse à Cette question . Cependant, je ne comprends pas comment si la tête code> est code> Si quelqu'un pouvait me montrer le merci pour toute aide p>
Edit: Je n'ai besoin que de la liste à parcourir. Si tel est le cas, la logique doit-elle être modifiée de manière drastique? P> lien code> et
linearlinkedlist code> classes, mais je ne peux tout simplement pas pour la vie de moi de comprendre comment les modifier dans une création de
CircularLinkedList code>. p>
Aucun code>, alors comment un objet
Aucun code> -TYPE a un
suivant code> attribut? Je n'arrive tout simplement pas de saisir le concept. P>
__ init __ code> fonction d'un échantillon
circulaireLinkedlist code> et une simple explication sur la façon dont cela fonctionne, je pense que je pourrais la comprendre. < / p>
5 Réponses :
L'étape cruciale ici est que la tête n'est pas Aucun code>. Seules les données du nœud code> lien code> de la tête sont
Aucun code>, et il pointe de lui-même via son attribut
suivant code>. Comme mentionné dans la réponse que vous avez liée, cela ressemblerait à ceci:
def __init__(self):
self.head = Link(None, None)
self.head.next = self.head
Je pense que je commence à l'obtenir. Merci!
en effet; S'il n'y a pas de nœuds, il ne peut y avoir de nœuds suivants / précédents: S'il y a un nœud, il se lie à l'envers et en avant à lui-même: P> root
|
v
+-> Node +-> Node <--+
| next---+ next--+ |
+-|---prev <-----prev | |
| +--------------------+ |
+------------------------+
Votre situation pour «No Bonne-nœuds» n'est pas tout à fait la situation que l'OP décrit (bien que ce soit une approche possible). Au lieu de cela, c'est plus étroitement ressemblant à la situation que vous décrivez comme un nœud «un». Votre approche pourrait être une représentation plus pratique, car elle permet de faciliter le Aucun code> -Test.
Merci pour la représentation visuelle. J'apprécie l'aide!
souvent dans une liste liée circulaire, vous avez un lien spécial qui ne contient pas de données significatives. Au lieu de cela, c'est un "Sentinel" vous permettant de savoir où se trouve le début (et la fin) de la liste. Ce lien existe même lorsque la liste est vide, vos algorithmes vont donc fonctionner sur toutes les listes, sans beaucoup de cas spéciaux nécessitant un code spécial.
class Link: def __init__(self, data, next): self.data = data self.next = next class CircularLinkedList: def __init__(self): self.head = Link(None, None) # this is the sentinel node! self.head.next = self.head # link it to itself def add(self, data): # no special case code needed for an empty list self.head.next = Link(data, self.head.next) def __contains__(self, data): # example algorithm, implements the "in" operator current = self.head.next while current != self.head: if current.data == data: # element found return True current = current.next return False
Supposons que je supprime le dernier lien. Ajustera-t-il automatiquement à la boucle au premier lien ou devrai-je me rendre compte manuellement dans ma fonction Supprimer? * Le figuré en jouant avec elle. Merci pour l'aide!
#Linked List Program to Add and Delete Node Form Head, Tail, in Between Nodes. class Node: """ Node Class having the data and pointer to the next Node""" def __init__(self,value): self.value=value self.nextnode=None class CircularLinkedList(object): """ Linked List Class to point the value and the next nond""" def __init__(self): self.head=None def add_head_node(self,value): node=Node(value) if self.head is None: self.head=node self.head.nextnode=self.head crnt_node=node crnt_node.nextnode=self.head first_node=self.head while first_node.nextnode is not self.head: first_node=first_node.nextnode first_node.nextnode=crnt_node self.head=crnt_node #Adding elements in linked list to the tail. def add_tail_node(self,value): node=Node(value) if self.head is None: self.head=node self.head.nextnode=self.head crnt_node=node last_node=self.head while last_node.nextnode is not self.head: last_node=last_node.nextnode #pointing head's last element to given node last_node.nextnode=crnt_node #pointing last node next to head nodes of element crnt_node.nextnode=self.head #Adding elements in linked after given Node. def add_after_node(self,after_value,value): node=Node(value) if self.head is None: self.head=node self.head.nextnode=self.head new_node=node after_node=Node(after_value) head_node=self.head while head_node.value !=after_node.value: head_node=head_node.nextnode last_node=head_node.nextnode head_node.nextnode=new_node new_node.nextnode=last_node head_node=head_node.nextnode #Adding elements in linked before given Node. def add_before_node(self,bfr_value,value): node=Node(value) if self.head is None: self.head=node self.head.nextnode=self.head new_node=node bfr_node=Node(bfr_value) head_node=self.head while head_node.nextnode.value!=bfr_node.value: head_node=head_node.nextnode last_node=head_node.nextnode head_node.nextnode=new_node new_node.nextnode=last_node head_node=head_node.nextnode #self.head=head_node.nextnode #deleting Head Node of Linked List def del_head_node(self): if self.head is None: print('Can not delete elements from Empty Linked List') return crnt_node=self.head.nextnode pointer_head=self.head.nextnode while pointer_head.nextnode.value!=self.head.value: pointer_head=pointer_head.nextnode pointer_head.nextnode=crnt_node self.head=crnt_node #deleting tail Node of Linked List def del_tail_node(self): if self.head is None: print('Can not delete elements from Empty Linked List') return crnt_node=self.head.nextnode #head_node=self.head while crnt_node.nextnode.nextnode.value!=self.head.value: crnt_node=crnt_node.nextnode crnt_node.nextnode=self.head #delete beteween node from Linked List def del_bw_node(self,value): node=Node(value) if self.head is None: print('Can not delete elements from Empty Linked List') return crnt_node=self.head while crnt_node.nextnode.value!=node.value: crnt_node=crnt_node.nextnode last_node=crnt_node.nextnode.nextnode crnt_node.nextnode=last_node #Function to print linked list node def print_list(self): crnt_node=self.head while True: print(f'{crnt_node.value}->',end='') if crnt_node.nextnode is self.head: print(f'{self.head.value}',end='') break crnt_node = crnt_node.nextnode print() cir_llist=CircularLinkedList() cir_llist.add_head_node(1) cir_llist.print_list() cir_llist.add_head_node(2) cir_llist.print_list() cir_llist.add_head_node(3) cir_llist.print_list() cir_llist.add_head_node(4) cir_llist.print_list() cir_llist.add_head_node(5) cir_llist.print_list() cir_llist.add_tail_node(6) cir_llist.print_list() cir_llist.add_tail_node(8) cir_llist.print_list() cir_llist.add_after_node(6,7) cir_llist.print_list() cir_llist.add_before_node(6,0) cir_llist.print_list() cir_llist.add_before_node(0,10) cir_llist.print_list() cir_llist.del_head_node() cir_llist.print_list() cir_llist.del_head_node() cir_llist.print_list() cir_llist.del_tail_node() cir_llist.print_list() cir_llist.del_tail_node() cir_llist.print_list() cir_llist.del_bw_node(10) cir_llist.print_list() cir_llist.del_bw_node(0) cir_llist.print_list()
for i in range(8): my_node = my_node.next_node print(my_node,end='->')
Pouvez-vous dessiner un diagramme pour une telle liste avec zéro, un, deux éléments etc? Cela devrait vous aider à déterminer comment organiser des choses. Aussi, demandez-vous si la liste est censée seulement contenir des liens dans une direction ou l'autre.
J'ai seulement besoin d'eux pour être connectés seuls. Cela crée-t-il une différence massive si j'en ai besoin de traverser également à l'envers?
Pour le dessin, c'est facile, mais certaines opérations sur une liste individuellement liée sont plus compliquées que sur une liste doublement liée.