You are on page 1of 8

1.

Sesin 2 (laboratorio): Listas enlazadas

1.1. Listas enlazadas simples


Objetivo

Practicar con algunos ejercicios bsicos de listas enlazadas simples.


Repaso terico

Una lista enlazada simple es una estructura de datos en la que cada


elemento apunta al siguiente. De este modo, teniendo la referencia del
principio de la lista podemos acceder a todos los elementos de la misma.
Lafigura 1 representa esta estructura de datos.
Figura 1. Representacin grfica de una lista enlazada simple

La lista enlazada se compone de nodos (objetos instanciados


pertenecientes a la clase Node), cada uno de los cuales tiene dos nicas
tareas: guardar la informacin de la posicin i y ofrecer una referencia a
la posicin i+1.
Ejercicio

Implementa una clase que modele una lista enlazada simple. Debes seguir
los siguientes pasos:
1. Lee detenidamente los requisitos funcionales de la clase.
2. Piensa en el diseo de la estructura de datos. Heredar de alguna
otra clase? Implementar alguna interfaz? Utilizar objetos de
alguna otra clase? Te ser til tener papel y boli a mano.
3. En paralelo a la implementacin de la clase que se pide, programa
una clase de prueba que simplemente cree un objeto de tipo lista
enlazada simple y ponga a prueba sus diferentes mtodos.
La clase que programes se deber llamar MySimpleLinkedList. Utiliza para ello
una estructura interna de tipo Node(tendrs que programar dicha clase). Los
mtodos pblicos que debe ofrecer la clase MySimpleLinkedList son:

: Devuelve

public boolean isEmpty()

TRUE

, dependiendo de si la lista est

FALSE

o no vaca.

public void insert(Object o)

public Object extract()

public void print(int n)

public void print()

: Aade un elemento al principio de la lista (el


principio es el elemento apuntado por first en la figura 1).
: Elimina de la lista el elemento que est al principio
de la misma y devuelve el valor que dicho elemento tena
almacenado. Ojo al caso en que la lista no contenga ningn
elemento.
: Imprime por salida estndar el valor del objeto
almacenado en la posicin n (se empieza a contar en 0). Si la lista
tiene menos de n-1 posiciones, no imprime nada. La ejecucin de este
mtodo no debe modificar el contenido de la lista.
: Imprime la lista desde la posicin inicial hasta la
posicin final. La ejecucin de este mtodo no debe modificar el
contenido de la lista.

No olvides implementar una clase MySimpleLinkedListTest que sirva para


comprobar el buen funcionamiento del cdigo que vas desarrollando.
SOLUCION:

Node.java
public class Node {
private Object info;
private Node next;
public Node() {
info = null;
next = null;
}
public Node(Object o, Node n) {
setInfo(o);
setNext(n);
}
public void setInfo(Object o) {
info = o;
}
public void setNext(Node n) {
next = n;
}
public Object getInfo() {
return info;
}

public Node getNext() {


return next;
}

MySimpleLinkedList.java
public class MySimpleLinkedList {
// the reference to the first node is enough
// to characterize a list
protected Node first;
// a list is created in an empty state
public MySimpleLinkedList() {
first = null;
}
// the new element is located before the
// former first node
public void insert(Object o) {
// step by step code. Could be done in less lines
// a node that stores the object and links nowhere
Node tmp = new Node(o, null);

// the following sentence has no problem with null values of "first"


tmp.setNext(first);
// we move the "first" reference
first = tmp;

// extracts the first element and returns its object


public Object extract() {
Object out = null;
// if first is null, you cannot call its methods
if (!isEmpty()) {
out = first.getInfo();
first = first.getNext();
}
// if the list is empty, null should be returned, but this is
// the default value of "out"
return out;
}
public void print(int n) {
// if the list is empty, do nothing
if (!isEmpty()) {
Node tmp = first;
// iterates until i reaches n or the list is finished.
for (int i = 0; i < n; i++) {
tmp = tmp.getNext();
if (tmp == null)
return; // the list is finished
}
System.out.println(tmp.getInfo());
}

public void print() {


// if the list is empty, do nothing
if (!isEmpty()) {
Node tmp = first;
// iterates until the list is finished
while (tmp != null) {
System.out.println(tmp.getInfo());
tmp = tmp.getNext();
}
}
}

public boolean isEmpty() {


if (first == null)
return true;
else
return false;
}

MySimpleLinkedListTest.java
public class MySimpleLinkedListTest {
public static void main(String args[]) {
// just instantiate one object and call the methods.
// I'm sure you can do it better than this code
MySimpleLinkedList sll = new MySimpleLinkedList();
sll.insert(new
sll.insert(new
sll.insert(new
sll.insert(new
sll.insert(new

Integer(1));
Integer(2));
Integer(3));
Integer(4));
Integer(5));

sll.print();
sll.print(0);
sll.print(1);
sll.print(2);
sll.print(3);
sll.print(4);
System.out.println(sll.extract());
System.out.println(sll.extract());
System.out.println(sll.extract());
System.out.println(sll.extract());
System.out.println(sll.extract());
}

sll.print();

1.2. Ms sobre listas enlazadas simples


Objetivo

Practicar con algunos ejercicios bsicos de listas enlazadas simples.


Repaso terico

Si ya dispones de la implementacin de una lista enlazada, puedes


reutilizar el cdigo simplemente creando una nueva clase que herede de la
que ya tenamos. As, tendrs gran parte de la funcionalidad con muy
poco esfuerzo.
Ejercicio

Implementa una clase que modele una lista enlazada. Puedes basarte
en MySimpleLinkedList. Debes seguir los siguientes pasos:
1. Lee detenidamente los requisitos funcionales de la clase. Asegurate
de que has entendido la descripcin de cada uno de los mtodos a
implementar.
2. Piensa en el diseo de la estructura de datos. Heredar de alguna
otra clase? Implementar alguna interfaz? Utilizar objetos de
alguna otra clase? Te ser til tener papel y boli a mano.
3. En paralelo a la implementacin de la clase que se pide, programa
una clase de prueba que simplemente cree un objeto de tipo lista
enlazada simple y ponga a prueba sus diferentes mtodos.
La clase que programes se deber llamar MyAdvancedLinkedList. Los mtodos
pblicos que debe ofrecer dicha clase son:

public void insert(Object o, int n)

public Object extract(int n)

public String toString(int n)

public String toString()

: Inserta un nuevo elemento en la lista,


colocandolo en la posicin n. Si nes mayor que el tamao de la lista,
lo inserta en la ltima posicin. Si la lista est vaca, lo inserta como
primer y nico elemento.
: Elimina de la lista el elemento que est en la
posicin n y devuelve el valor que dicho elemento tena almacenado.
Tras la ejecucin del mtodo, la posicin n-1 deber apuntar a la
posicin n+1. Si la lista es demasiado corta, elimina el ltimo
elemento.
: Devuelve un String, que es la representacin
textual del objeto almacenado en la posicin n de la lista. Si la lista
tiene menos de n-1 posiciones, el mtodo devuelve null. La ejecucin
de este mtodo no debe modificar el contenido de la lista.
: Devuelve un String, que es el resultado de
concatenar la representacin textual cada uno de los objetos de la

lista. Inserta un espacio entre cada dos elementos. La ejecucin de


este mtodo no debe modificar el contenido de la lista.
No olvides implementar una clase MyAdvancedLinkedListTest que sirva para
comprobar el buen funcionamiento del cdigo que vas desarrollando.
SOLUCION:
MyAdvancedLinkedList.java
public class MyAdvancedLinkedList extends MySimpleLinkedList {
// this code is the same than writting nothing.
// That is, there is no need to write it
public MyAdvancedLinkedList() {
super();
}
// insert one object in a specific position
public void insert(Object o, int n) {
if (isEmpty() || n <= 0) {
// in some cases, we can use the already implemented method
// note that this is the same than super.insert(o)
insert(o);
} else {
// we use "iterator" instead of "first", so we don't modify the
// "first" reference
Node iterator = first;
for (int i = 1; i < n; i++) {
if (iterator.getNext() == null)
break; // we stop is we reach the end of the list
iterator = iterator.getNext();
}

// now we know where. We just have to create the node and


// insert it
Node tmp = new Node(o, iterator.getNext());
iterator.setNext(tmp);

}
// extract the object in a specific position
public Object extract(int n) {
if (n <= 0 ||
isEmpty() ||
first.getNext() == null) { // only one element
return extract();
}
// find previous (n-1 element or next-to-last)
Node prev;
{

prev = first;
Node current = first.getNext();
int i = 1; // index of current
// search until last is found or current position is n
// meanwhile update prev, current and i
while (current.getNext() != null && i != n) {
prev = current;
current = current.getNext();
i++;
}

// actual extraction
Object info = prev.getNext().getInfo();
prev.setNext(prev.getNext().getNext());
return info;

public String toString(int n) {


String out = null;
// if the list is empty, return a null reference
if (!isEmpty()) {
Node tmp = first;
// iterates until i reaches n or the list is finished.
for (int i = 0; i < n; i++) {
tmp = tmp.getNext();
if (tmp == null)
return out; // the list is finished
}
out = tmp.getInfo().toString();
}
return out;
}
public String toString() {
String out = null;
// if the list is empty, return a null reference
if (!isEmpty()) {
out = ""; // null was only for empty lists
Node tmp = first;
// iterates until the list is finished
while (tmp != null) {
out = out + tmp.getInfo() + " ";
tmp = tmp.getNext();
}
}
// trim removes space characters at the end of the String
return out.trim();
}
}

You might also like