1
votes

Ques de liste chaînée simples

Donc, dans le premier code, je crée a.next = b. Ce qui signifie que a.next et b agissent comme une référence à Node6. SO quand je fais b = None .. Pourquoi est-ce que a.next pointe toujours vers Node6,

Dans le deuxième code, quand je suis en train de faire c = a, c et a sont des références au Node 5. Maintenant je fais c.next = None, mais ce changement se reflète également dans un. même a.next devient None.

LES DEUX CODES J'AI FAIT LES MÊMES ÉTAPES, Pourquoi le changement n'est-il reflété que dans le code 2?

class Node:
     def __init__(self, x):
         self.val = x
         self.next = None

a=Node(5)
b=Node(6)
a.next=b
c=a
c.next=None
while a is not None:
    print(a.val)
    a=a.next

CODE 2

class Node:

     def __init__(self, x):
         self.val = x
         self.next = None

a=Node(5)
b=Node(6)
a.next=b
b=None
while a is not None:
    print(a.val)
    a=a.next


8 commentaires

Dans le premier exemple, vous définissez b sur Aucun ce qui ne supprime pas l'objet référencé, car il y a encore une référence à cet objet dans a.next . Dans le deuxième exemple, vous ne changez rien, car vous définissez a.next sur None , ce qui est déjà None par défaut.


J'ai édité code2. Veuillez répondre pour cela monsieur.


Mais maintenant, les premier et deuxième exemples sont les mêmes.


Désolé voir maintenant monsieur.


WHen I make c.next = None ... Pourquoi a.next devient-il également None? Je fais exactement la même chose.


Lorsque vous créez c = a , vous ne passez pas les valeurs de a mais la référence à a. Donc, à partir de là, c fera référence au même objet auquel se réfère a.


Dans le premier code, même a.next fait référence à b, non? Node6 dans les deux. Alors pourquoi ne change-t-il pas?


@NeverGiveUp, parce que vous ne le changez pas. b stocke la référence à l'objet. a.next stocke la référence à un objet dame. Vous avez juste une référence nulle, pas un objet.


3 Réponses :


0
votes

Dans le premier cas, vous stockez b dans a.next , donc en parcourant la liste liée avec le nœud principal comme a vous traverser tous les nœuds.

Mais dans le second cas, c et a ayant la même référence, et c.next est Aucun donc chaque fois que vous parcourez la liste liée avec la tête comme c , vous obtenez un seul nœud. Comme alors que a n'est pas None condition ne permettant pas de se déplacer pour le nœud suivant.

Le code suivant fonctionne comme prévu.

class Node:
    def __init__(self, x):
        self.val = x
        self.next = None


a = Node(5)
b = Node(6)
c = a
c.next = b #this line changed
while a is not None:
    print(a.val)
    a = a.next

p>


1 commentaires

Merci une tonne mec



1
votes

Vous avez une classe Node . Lorsque vous créez un objet de cette classe et que vous l'assignez à une variable telle que a ou b , vous allouez dynamiquement une mémoire suffisamment grande pour contenir le contenu de l'objet, puis attribuer l ' adresse de cette mémoire à la variable. Donc CODE 1 vraiment ressemble plus à:

x = 5
y = 7
x = y
y = 0

La déclaration 5 met à jour l'attribut next du nœud qui a été alloué dans la déclaration 1 avec la valeur de b , qui est addr2 . Dans la déclaration 6, nous attribuons une nouvelle valeur à b , mais cela ne changera pas ce qui a été stocké dans l'objet réel référencé par a . Prenons l'exemple suivant avec des entiers:

addr1 = storage address for Node(5) // Statement 1
a = addr1 // Statement 2
addr2 = storage address for Node(6) // Statement 3
b = addr2 // Statement 4
a.next = b // Statement 5
b = None // Statement 6

Le paramètre y = 0 n'affecte pas l'affectation précédente de x = y code >, c'est-à-dire que x aura toujours la valeur précédente de y de 7. La seule différence dans votre exemple est que nous n'avons pas affaire à des entiers mais à des adresses.

Maintenant que nous apprécions que a code > et b sont en réalité des références à des emplacements mémoire (c'est-à-dire des adresses) qui contiennent les objets réels, quand vous dites c = a , c et a font maintenant référence au même objet et peuvent être utilisés de manière interchangeable. Ainsi, c.next et a.next font référence au même attribut.


1 commentaires

Merci Monsieur pour l'aide



3
votes

Permettez-moi de vous expliquer en utilisant une représentation schématique: entrez la description de l'image ici

Dans le cas 1: la liste a a deux nœuds 5 et 6 dans la liste liée. Mais dans le cas 2: les listes a et c ont un nœud 5 dans la liste chaînée. Et une autre liste chaînée est pointée par b qui n'en a que 6.

J'espère que cela clarifie votre doute.

REMARQUE: - Puisque a, b, c sont des pointeurs stockant des adresses. Lorsque vous exécutez c.next = None , la valeur de next à l'adresse pointée par c (également pointée par a ) devient None.


3 commentaires

Mm merci. J'ai eu du mal à comprendre cela. Je suppose que c'est tellement basique lol


Heureux d'aider! Les pointeurs sont parfois déroutants dans le code, ce n'est que lorsque vous les écrivez qu'ils deviennent clairs.


Ouais ... C'est drôle, c'est similaire à ça, a = 5, b = 6, a = b, b = 66 ... Lol