Exercice n°1

public class Cell {

  public int value;
  public Cell next;

  public Cell(int value) {
    this.value = value;
    next = null;
  }
}
public class ListSimple {

    public Cell head;
    public int size;

    public ListSimple() {
	head = null;
	size = 0;
    }

    public Cell find(int value) {
    }

    public Cell get(int index) {
    }

    public Cell append(int value) {
    }

    public Cell insert(int value, int index) {
    }

    public Cell replace(int value, int index) {
    }

    public Cell removeAt(int index) {
    }

    public Cell remove(int value) {
    }

    public void print() {
    }
}
class TestSimple {

    public static void main(String[] args) {

	ListSimple liste = new ListSimple();
	liste.append(20); // liste vide -> insertion en tête
	liste.insert(10,-5); // insertion en tête
	liste.insert(30,7); // insertion en fin
	liste.append(50); // ajout en fin
	liste.insert(40,3); // insertion en 3
	liste.print(); // affiche 10 20 30 40 50
	liste.remove(12); // ne fait rien
	liste.remove(10); // enlève la valeur 10 (la tête)
	liste.removeAt(-2); // ne fait rien
	liste.removeAt(22); // ne fait rien
	liste.removeAt(2); // enleve la valeur en 2 (i.e. 40)
	liste.print(); // affiche 20 30 50
	Cell c = liste.get(-1); // accès en dehors -> renvoie null
	if (c != null) {
	    System.out.println("pb with get()");
	}
	c = liste.get(99); // accès en dehors -> renvoie null
	if (c != null) {
	    System.out.println("pb with get()");
	}
	c = liste.find(99); // value inexsitante -> renvoie null
	if (c != null) {
	    System.out.println("pb with find()");
	}
	c = liste.find(20);
	if (c.value != 20) {
	    System.out.println("pb with find()");
	}
	c = liste.find(50);
	if (c.value != 50) {
	    System.out.println("pb with find()");
	}
    }
}

Exercice n°2


Exercice n°3

public class CellDouble {

    public int value;
    public CellDouble prev;
    public CellDouble next;

    public CellDouble(int value) {
	this.value = value;
	prev = null;
	next = null;
    }
}
public class ListDoubleCirc {

    public CellDouble head;
    public int size;

    public ListDoubleCirc() {
	head = null;
	size = 0;
    }

    public CellDouble find(int value) {
	// quasi identique à l'exo 1, excepté le test d'arrêt
    }

    public CellDouble get(int index) {
	// pour éviter de tout parcourir, on peut tester si l'indice
        // est avant ou après la moitié de la liste. S'il est avant,
        // on explore la liste grâce à next, et sinon grâce à prev
    }

    public CellDouble append(int value) {
	// pas besoin de trouver la dernière cellule : on y a accès
	// grâce à prev de la tête. Seul cas particulier, la liste est vide
    }

    public CellDouble prepend(int value) {
	// pas compliqué : insertion en tête = insertion en fin
	// puis déplacement de la tête
    }

    public CellDouble insert(int value, int index) {
	// on a get() pour trouver la cellule du point d'insertion
	// Seul cas particulier, la liste est vide
    }

    public CellDouble replace(int value, int index) {
	// utiliser get()
    }

    public CellDouble removeAt(int index) {
	// utiliser get()
    }

    public CellDouble remove(int value) {
	// utiliser find
    }
}