2014-06-15 5 views
-2

Comment se fait-il que lorsque je crée un noeud de liste chaînée, que j'ajoute des données, que je déplace la tête dans une autre méthode, la tête reste la même dans la méthode de l'appelé?Liée liste Pointer Scope

Par exemple:

public static void append(Node n, int d) { 
    while (n.next != null) { 
     n = n.next; 
    } 

    n.next = new Node(d); 
} 

public static void test(Node n) { 
    n = n.next; 
} 

public static void main(String[] args) { 
    Node head = new Node(5); 
    append(head, 4); 
    append(head, 3); 

    test(head); //this moves the head to head.next 
    //why is head still = 5 after we get here? 
} 
+4

Votre méthode 'test' ne fait ** rien **. –

+0

tête devrait être passée par référence droite? En test, quand je déplace n = n.next, n.data = 4 dans cette méthode, mais dans main, comment se fait-il head.data = 5? – MiketheViking90

+0

@ MiketheViking90 "tête doit être passé par référence de droite?" Non, la référence est transmise par valeur. – Boann

Répondre

0

next est une propriété, pas une méthode. Votre méthode test est juste saisir la référence à n.next, ce n'est pas "déplacer la tête".

1

Dans la méthode append, la ligne n = n.next n'affecte pas le noeud d'origine transmis comme argument, dans votre cas head. Pourquoi?Because Java is pass by value. Cela signifie que si à l'intérieur de la méthode, vous modifiez la référence de head (qui est reçue comme n à l'intérieur de la méthode), cela n'affectera pas la référence d'origine. Par conséquent, head référera toujours au même emplacement dans la mémoire (le même objet).

En outre, votre méthode test ne fait rien parce que vous créez une variable locale:

Node next = ...; 

puis assigner n.next à lui. Mais cette variable n'existe qu'à l'intérieur de cette méthode, donc elle n'affectera rien en dehors de celle-ci.

+0

"la ligne n = n.next n'affectera pas le nœud d'origine n ... n se référera toujours au même emplacement en mémoire". C'est très trompeur. Ce code fonctionne parfaitement bien dans la méthode. – Boann

+0

@Boann édité pour clarifier. Est-ce juste maintenant? – Christian