Está en la página 1de 10

Captulo 2 Listas enlazadas Las listas enlazadas se puede considerar desde una perspectiva de alto nivel como una

serie de los nodos. Cada nodo tiene al menos un puntero al siguiente nodo, y en el caso del ltimo nodo de un puntero nulo que representa que no hay ms nodos en el lista enlazada. DSA en las implementaciones de las listas enlazadas mantener siempre la cabeza y la cola punteros para que la insercin, ya sea en la cabeza o la cola de la lista es una constante tiempo de operacin. Insercin al azar queda excluido de esta y ser un lineal la operacin. Por lo tanto, las listas enlazadas en DSA tienen las siguientes caractersticas: 1. La insercin es O (1) 2. La eliminacin es O (n) 3. La bsqueda es O (n) De las tres operaciones de la que se destaca es el de la insercin. En DSA se opt por mantener siempre punteros (o ms acertadamente referencias) para la nodo (s) a la cabeza y la cola de la lista enlazada y por lo tanto la realizacin de una tradicional la insercin de la parte delantera o trasera de la lista enlazada es una operacin O (1) la operacin. Un excepcin a esta regla es la realizacin de una insercin antes de un nodo que no es ni la cabeza ni la cola en una lista enlazada. Cuando el nodo que estamos insertando antes est en algn lugar en medio de la lista enlazada (conocida como la insercin al azar) de la complejidad es O (n). Con el fin de agregar antes del nodo designado tenemos que recorrer la lista vinculada a encontrar predecesor actual que nodo. Este recorrido los rendimientos de una operacin O (n) el tiempo de ejecucin. Esta estructura de datos es trivial, pero las listas enlazadas tienen algunos puntos clave que en veces los hacen muy atractivos: 1. la lista es dinmica cambia de tamao, por lo que no incurre en penalidad copia como una matriz o vector eventualmente incurrir, y 2. insercin es O (1). 2.1 lista enlazada
2. Listas ligadas son una de las estructuras de datos ms primitiva se

encuentra en este libro. Cada nodo que forma una lista enlazada se compone de un valor, y una referencia al nodo siguiente (si hay) en la lista.

CAPTULO 2. Listas enlazadas 10 Figura 2.1: Individualmente nodo de lista enlazada

Figura 2.2: Una lista enlazada poblados con nmeros enteros 2.1.1 Insercin En general cuando se habla de insercin con respecto a las listas vinculadas de cualquier forma en que se refieren implcitamente a la adicin de un nodo a la cola de la lista. Cuando se utiliza una API como la de la DSA, y ver un mtodo de propsito general que agrega un nodo a la lista, se puede asumir que va a agregar el nodo a la cola de la lista y no la cabeza. Agregar un nodo a una lista ligada tiene slo dos casos: 1. cabeza = , en cuyo caso el nodo que se agrega ahora la cabeza y la cola de la lista, o 2. simplemente tenemos que aadir nuestro nodo en el extremo de la lista de la actualizacin del la cola de referencia apropiada. 1) Agregar algoritmo (valor) 2) Pre: el valor es el valor que se suma a la lista 3) Nota: El valor se ha colocado en la cola de la lista 4) nodo n (valor) 5) si la cabeza = 6) la cabeza n 7) la cola n 8) ms 9) tail.Next n 10) la cola n 11) end if 12) Agregar final Como ejemplo del algoritmo anterior considerar la adicin de la siguiente secuencia de los nmeros enteros a la lista: 1, 45, 60 y 12, la lista resultante es el de Figura 2.2.

2.1.2 Bsqueda Buscar en una lista vinculada es sencillo: simplemente recorrer la lista de cheques el valor que estamos buscando con el valor de cada nodo de la lista enlazada. La algoritmo que figuran en esta seccin es muy similar a la utilizada para el recorrido en el 2.1.4. CAPTULO 2. Listas enlazadas 11 1) algoritmo contiene (cabeza, valor) 2) Pre: la cabeza es el nodo principal en la lista 3) El valor es el valor a buscar 4) Nota: el elemento o est en la lista enlazada, es cierto, de lo contrario falso 5) n cabeza 6), mientras que n = y n.Value = valor 7) n n.Next 8) final, mientras que 9) si n = 10) return false 11) end if 12) return true 13) Contiene final 2.1.3 Borrado Eliminacin de un nodo de una lista enlazada es sencillo pero hay unos pocos casos tenemos que tener en cuenta: 1. la lista est vaca, o 2. el nodo a eliminar es el nico nodo en la lista enlazada, o 3. vamos a eliminar el nodo principal, o 4. vamos a eliminar el nodo de la cola, o 5. el nodo a eliminar est en algn lugar entre la cabeza y la cola, o 6. el elemento a eliminar no existe en la lista enlazada El algoritmo de cuyos casos se ha descrito que quitar un nodo desde cualquier lugar dentro de una lista, independientemente de si el nodo es la cabeza, etc Si usted sabe que estos alimentos slo nunca se quita de la cabeza o la cola de la lista a continuacin pueden crear algoritmos mucho ms conciso. En el caso de la eliminacin de siempre la parte frontal de la eliminacin lista enlazada se convierte en un O (1) la operacin.

CAPTULO 2. Listas enlazadas 12 1) Retirar el algoritmo (la cabeza, valor) 2) Pre: la cabeza es el nodo principal en la lista 3) El valor es el valor de eliminar de la lista 4) Nota: el valor es retirado de la lista, es cierto, de lo contrario falso 5) si la cabeza = 6) / / caso 1 7) return false 8) end if 9) n cabeza 10) si n.Value = valor 11) si la cabeza de la cola = 12) / / caso 2 13) la cabeza 14) cola 15) ms 16) / / caso 3 17) la cabeza head.Next 18) end if 19) return true 20) end if 21), mientras que n.Next = y n.Next.Value = valor 22) n n.Next 23) final, mientras que 24) si n.Next = 25) si n.Next = cola 26) / / el caso 4 27) la cola n 28) end if 29) / / esto es slo el caso 5, si el condicional en la lnea 25 era falsa 30) n.Next n.Next.Next 31) return true 32) end if 33) / / case 6 34) return false 35) Quitar final

2.1.4 Recorrido de la lista Recorrer una lista enlazada es la misma que la de atravesar un vinculadas doblemente lista (que se define en el 2.2). Usted empieza en la cabeza de la lista y continuar hasta que vienen a travs de un nodo que es . Los dos casos son los siguientes: 1. nodo = , hemos agotado todos los nodos de la lista vinculada, o 2. debemos actualizar la referencia de nodo que se va node.Next. El algoritmo descrito es una muy simple que hace uso de un simple while para comprobar el primer caso. CAPTULO 2. Listas enlazadas 13 1) algoritmo de Traverse (cabeza) 2) Pre: la cabeza es el nodo principal en la lista 3) Nota: los elementos de la lista se han atravesado 4) n cabeza 5), mientras que n = 0 6) el rendimiento n.Value 7) n n.Next 8) final, mientras que 9) final Traverse 2.1.5 Recorrido de la lista en orden inverso Recorrer una lista ligada de una manera hacia delante (es decir, de izquierda a derecha) es simple como se demostr en el 2.1.4. Sin embargo, lo que si queremos recorrer los nodos en la lista enlazada en orden inverso, por alguna razn? El algoritmo para llevar a cabo tales un recorrido es muy simple, y como demostr en el 2.1.3 tendremos que adquirir una referencia al antecesor de un nodo, a pesar de la fundamental caractersticas de los nodos que conforman una lista vinculada individualmente hacen de este un operacin costosa. Para cada nodo, la bsqueda de su predecesor, es una operacin O (n), as en el transcurso de atravesar toda la lista hacia atrs el costo se convierte en O (n2). Figura 2.3 muestra el siguiente algoritmo se aplica a una lista enlazada con los enteros 5, 10, 1 y 40. 1) algoritmo ReverseTraversal (cabeza, cola) 2) Pre: cabeza y cola pertenecen a la misma lista 3) Nota: los elementos de la lista se han recorrido en orden inverso 4) si la cola = 5) curr cola 6), mientras que la cabeza curr = 7) prev cabeza 8), mientras que prev.Next = curr 9) prev prev.Next 10) final, mientras que

11) el rendimiento curr.Value 12) curr prev 13) final, mientras que 14) el rendimiento curr.Value 15) end if 16) final ReverseTraversal Este algoritmo es slo de inters real cuando estamos solos con listas enlazadas, como pronto se ver que las listas doblemente enlazadas (que se define en el 2.2) que la lista inversa de recorrido simple y eficiente, como se muestra en el 2.2.3. 2.2 lista doblemente enlazada Listas doblemente enlazadas son muy similares a las listas ligadas. La nica diferencia es que cada nodo tiene una referencia a los dos nodos anterior y siguiente en la lista.

CAPTULO 2. Listas enlazadas 14 Figura 2.3: Invertir traveral de una lista enlazada

Figura 2.4: nodo de la lista doblemente enlazada CAPTULO 2. Listas enlazadas 15 Los algoritmos siguientes de la lista doblemente enlazada son exactamente los mismos que los mencionados anteriormente para la lista enlazada: 1. Bsqueda (se define en 2.1.2) 2. Transversal (se define en 2.1.4) 2.2.1 Insercin La nica diferencia importante entre el algoritmo en el 2.1.1, es que tenemos que Recuerdo que se unen el puntero anterior de la n al nodo de la cola anterior, si n se no el primer nodo que se inserta en la lista. 1) Agregar algoritmo (valor) 2) Pre: el valor es el valor que se suma a la lista 3) Nota: El valor se ha colocado en la cola de la lista 4) nodo n (valor) 5) si la cabeza = 6) la cabeza n 7) la cola n 8) ms 9) n.Previous cola 10) tail.Next n 11) la cola n 12) end if 13) Agregar final

2) La Figura 2.5 muestra la lista doblemente enlazada despus de agregar la secuencia de nmeros enteros se define en 2.1.1.

Figura 2.5: lista doblemente enlazada poblados con nmeros enteros 2.2.2 Borrado Como se puede adivinar de los casos que se utiliza para su eliminacin en una doblemente enlazada lista son exactamente los mismos que los definidos en el 2.1.3. Al igual que la insercin que tiene la aadido tarea de unirse a una referencia adicional (anterior) al valor correcto. CAPTULO 2. Listas enlazadas 16 1) Retirar el algoritmo (la cabeza, valor) 2) Pre: la cabeza es el nodo principal en la lista 3) El valor es el valor de eliminar de la lista 4) Nota: el valor es retirado de la lista, es cierto, de lo contrario falso 5) si la cabeza = 6) return false 7) end if 8) si el valor = head.Value 9) si la cabeza de la cola = 10) la cabeza 11) cola 12) ms 13) la cabeza head.Next 14) head.Previous 15) end if 16) return true 17) end if 18) n head.Next 19), mientras que n = y el valor = n.Value 20) n n.Next 21) final, mientras que 22) Si n = cola 23) la cola tail.Previous 24) tail.Next 25) return true 26) else if n = 27) n.Previous.Next n.Next 28) n.Next.Previous n.Previous 29) return true 30) end if 31) return false 32) Quitar final

2.2.3 Invertir Traversal Listas ligadas con un diseo slo hacia adelante, por lo que a la inversa el recorrido algoritmo definido en el 2.1.5 requiere un invento creativo. Listas doblemente enlazadas hacer el recorrido inverso hacia adelante tan simple como el recorrido (que se define en el 2.1.4), excepto que comienzan en el nodo de la cola y actualizar los punteros en la direccin opuesta.

La figura 2.6 muestra el reverso algoritmo de recorrido en la accin. CAPTULO 2. Listas enlazadas 17 Figura 2.6: doblemente enlazada lista inversa de recorrido 1) algoritmo ReverseTraversal (cola) 2) Pre: la cola es el nodo de la cola de la lista para atravesar 3) Nota: la lista ha sido recorrido en orden inverso 4) n cola 5), mientras que n = 6) el rendimiento n.Value 7) n n.Previous 8) final, mientras que 9) final ReverseTraversal

2.3 Resumen Las listas enlazadas son buenas para usar cuando se tiene un nmero indeterminado de elementos que almacn. Utilizando una estructura de datos como una matriz que es necesario especificar el tamao en la delantera, superior al tamao implica invocar un algoritmo de redimensionamiento que se ha un tiempo en forma lineal. Tambin debe utilizar listas enlazadas cuando slo se eliminar nodos, ya sea en la cabeza o la cola de la lista para mantener un tiempo de ejecucin constante. Para ello es necesario el mantenimiento de los punteros a los nodos en la cabeza y la cola de la lista pero la sobrecarga de la memoria se pagar por s mismo si se trata de una operacin que se realizar muchas veces. Lo que las listas enlazadas no son muy buenos es para la insercin aleatoria, el acceso a los nodos por el ndice, y la bsqueda. A costa de un poco de memoria (en la mayora de los casos 4 bytes sera suficiente), y un poco ms de lectura / escritura se puede mantener una cuenta la variable que registra el nmero de elementos se incluyen en la lista para que el acceso a como una propiedad primitiva es una operacin constante - slo tiene que actualizar contar durante los algoritmos de insercin y supresin. Listas ligadas se debe utilizar cuando se est solo realizando inserciones bsicas. En general, listas doblemente enlazadas son ms flexibles para no trivial las operaciones en una lista enlazada. Se recomienda el uso de una lista doblemente enlazada en caso de requerir adelante y hacia atrs recorrido. Para la mayora de los casos este requisito est presente. Para ejemplo, considere un flujo de seal que desea analizar en un descenso recursivo la moda. Algunas veces usted tendr que dar marcha atrs con el fin de crear la correcta anlisis de los rboles. En este escenario una lista doblemente enlazada es el mejor ya que su diseo hace que bi-direccional de recorrido mucho ms simple y ms rpido que el de una ligada sencilla

También podría gustarte