2011-05-04 8 views
6

me preguntaba cómo se ejecuta el bucle while. ya que establecemos que 'siguiente' sea nulo cuando lo declaramos por primera vez, ¿cuándo cambia a no nulo? y también lo que hace 'Nodo n = esto; '¿significa? ¿Eso es significativo para este código? Cada vez que declaramos una nueva instancia del objeto Node, ¿hace una copia de sus propios campos separados de la clase? ¡Gracias un montón! Definitivamente agradecería explicaciones claras y fáciles de entender. Gracias de nuevo =)anexando a la lista de enlaces

class Node { 
    Node next = null; 
    int data; 
    public Node(int d) { data = d; } 
    void appendToTail(int d) { 
     Node end = new Node(d); 
     Node n = this; 
     while (n.next != null) { n = n.next; } 
     n.next = end; 
    } 
} 
+0

¿Qué idioma es este? –

Respuesta

6

Tiene una clase llamada Nodo con dos variables de instancia llamadas next y data. Se denominan variables de instancia porque pertenecen a las instancias de esta clase en lugar de a la clase misma. Es decir, su clase es básicamente una plantilla (o modelo) para objetos que tendrán su propio valor de datos y su próximo valor.

Para crear una instancia de la clase Node, debe llamar al constructor y pasar los parámetros necesarios. En tu caso, el constructor es;

public Node(int d) { 
     data = d; 
    } 

Para llamar a este constructor se usa la nueva palabra clave (en Java supongo) de esta manera;

Node x = new Node(10); 

Y tenga en cuenta que debe proporcionar un valor entero al constructor. En el cuerpo del constructor (entre {}) se ve que los datos variables se asignan al valor en d, que es el valor que se pasa al constructor, en este ejemplo, el valor 10. Ahora tiene un objeto de tipo Nodo con el valor 10 como datos y un nulo siguiente nulo.

En ese objeto, ahora puede llamar al método appendToTail(). Digamos que hacemos esto:

x.appendToTail(20); 

Permite rastrear lo que sucede.

Node end = new Node(d); 

Un nuevo nodo denominado extremo se crea y establece el valor 20 a los datos (recordar que d tiene el valor 20, por ahora, ya que es el valor que le pasamos cuando estábamos llamando el método). Este es un nodo totalmente independiente de x con su propio valor único para los datos.

Node n = this; 

esto es una autorreferencia al objeto actual. Como llamamos a este método en x, este es el mismo objeto que x.

while (n.next != null) { 
     n = n.next; 
    } 

Este bucle while se va a empezar a buscar el final de la lista yendo desde el nodo actual al siguiente nodo hasta el siguiente nodo es nulo. Como el único nodo que creamos hasta ahora es x, entonces n.next es en realidad nulo, por lo que el ciclo while no se ejecuta esta vez.

n.next = end; 

Ahora estamos estableciendo el siguiente valor de n (que es x) en el extremo del nodo que se creó. Ahora tiene una lista como esta:

10 -> 20 -> null 

Supongamos que se va a hacer la siguiente llamada:

x.appendToTail(30); 

Entonces una cosa similar sucede excepto cuando llegue al bucle mientras que el valor es n.next no nulo, entonces ingresa al cuerpo del ciclo y asigna n para apuntar a n.next, que en nuestro ejemplo es el nodo con 20. La siguiente iteración del ciclo produciría nulo, por lo que el ciclo se cerrará y el nuevo nodo con los datos 30 se establecerán en el siguiente valor del último nodo en la lista. Entonces usted tendrá:

10 -> 20 -> 30 -> null 
+0

¡Muchas gracias por su ayuda! – david

6

para responder a sus preguntas:

Q: "desde que nos propusimos 'siguiente' para ser nula cuando por primera vez a conocer, cuándo se ve modificado a no nulo?"

Cuando solo tiene un elemento en la lista, el 'siguiente' valor de ese Nodo se establecerá en NULO.

P: "¿y también qué significa 'Nodo n = esto;'?"

Esta declaración significa que la variable de referencia 'n' toma la referencia del objeto actual, que se especifica con 'this'.

P: "Cuando declaramos una nueva instancia del objeto Node, ¿hace una copia de sus propios campos separados de la clase?"

Se crearán variables de instancia para cada clase individual de la que haga una instancia. Esto significa que cada nodo tendrá 'siguiente' y 'datos'.

Por lo tanto, en su proceso de creación, es probable que tenga algo como esto:

enter image description here

Además, se repite el bucle while para el final de la lista y añade el elemento después del último nodo de la lista.

creo que sirve (: Si tienes alguna pregunta, después de vuelta (:

+0

+1 para algunos diagramas excelentes –

+0

¡Gracias! Espero que un enfoque visual le dé una mejor idea (: Solo espero ayudar (: ¡Salud! – Vern

+0

¡Muchas gracias por su ayuda! – david

1

Sin el nodo no copiarse a sí mismo El punto de la lista enlazada es tener un nodo se refieren a la siguiente en la lista. . Así que si usted tiene 3 elementos de una LinkedList, el primer nodo tiene una referencia a la segunda, y la segunda a la tercera.

Node one = new Node(1); 
one.appendToTail(2); 

se traducirá en un nodo, después de haber creado un nuevo nodo, y poner en su próximo campo one.next.data será igual a 2.

one.appendToTail(3) 

dará como resultado que el nodo uno se refiera al nodo 2, y el nodo 2 creará el nodo 3, y lo establecerá como su próximo campo.

one.data == 1 
one.next.data == 2 
one.next.next.data == 3 

El bucle es básicamente para buscar el último nodo en línea (ya que tiene su siguiente serie de nulo).

+0

Muchas gracias por su ayuda! – david

Cuestiones relacionadas