
public class Liste {
	Element premier;
	Element dernier;

	public Liste() {
		this.premier = null;
		this.dernier = null;
	}

	public Liste(Element premier, Element dernier) {
		this.premier = premier;
		this.dernier = dernier;
	}

	public boolean estVide() {
		return (this.premier == null);
	}
	public int longueur() {
		if(this.estVide()) {
			return 0;
		}
		else return premier.longueur();
	}

	public void afficher() {
		if(!this.estVide()) {
			this.premier.afficher();
		}
	}

	public void afficherInverse() {
		if(!this.estVide()) {
			this.premier.afficherInverse();
		}
	}

	public void ajouterDebut(int valeur) {
		Element x = new Element(valeur);
		x.setSuivant(this.premier);
		if(this.premier != null) {
			this.premier.setPrecedent(x);
		}
		this.premier = x;
		if(this.dernier == null) {
			this.dernier = x;
		}
	}

	public void ajouterFin(int valeur) {
		Element x = new Element(valeur);
		x.setPrecedent(this.dernier);
		if(this.dernier != null) {
			this.dernier.setSuivant(x);
		}
		this.dernier = x;
		if(this.premier == null) {
			this.premier = x;
		}
	}

	public void ajouterAvant(Element e, int valeur) {
		if (e == null) {
			return;
		}
		Element x = new Element(valeur);

		if(e.getPrecedent() != null) {
			e.getPrecedent().setSuivant(x);
		}
		else {
			this.premier = x;
		}
		x.setPrecedent(e.getPrecedent());
		x.setSuivant(e);
		e.setPrecedent(x);
	}

	public void supprimer(Element e) {
		if(e == null) {
			return;
		}
		if(e.getPrecedent() == null && e.getSuivant() == null) {
			this.premier = null;
			this.dernier = null;
			return;
		}
		if(e.getPrecedent() == null) {
			this.premier = e.getSuivant();
			e.getSuivant().setPrecedent(null);
			return;
		}
		if(e.getSuivant() == null) {
			this.dernier = e.getPrecedent();
			e.getPrecedent().setSuivant(null);
			return;
		}
		e.getPrecedent().setSuivant(e.getSuivant());
		e.getSuivant().setPrecedent(e.getPrecedent());
	}

	public boolean estTriee() {
		if(this.estVide()) {
			return true;
		}
		return this.premier.estTriee();
	}

	public void inverser(Element e) {
		if(e == null || e.getSuivant() == null) {
			return;
		}
		this.ajouterAvant(e, e.getSuivant().getValeur());
		this.supprimer(e.getSuivant());
	}

	public int passerEnOrdonnant() {
		if(this.estVide()) {
			return 0;
		}
		Element temp = this.premier;
		int n = 0;
		while(temp.getSuivant() != null) {
			if(temp.getValeur() > temp.getSuivant().getValeur()) {
				this.inverser(temp);
				n++;
			}
			else {
				temp = temp.getSuivant();
			}
		}
		return n;
	}

	public void trier() {
		while(this.passerEnOrdonnant() != 0) {
			;
		}
	}

	public boolean verifContraine() {
		if(this.estVide()) {
			return true;
		}
		else {
			return this.premier.verifContraine();
		}
	}

	public boolean estUnPalindrome() {
		if(this.estVide()) {
			return false;
		}
		else if(this.premier.getValeur() != this.dernier.getValeur()) {
			return false;
		}
		else if(this.premier == this.dernier){
			return true;
		}
		else {
			Liste x = new Liste(this.premier.getSuivant(), this.dernier.getPrecedent());
			return x.estUnPalindrome();
		}
	}

	public Liste moyenneLocale() {
		Liste x = new Liste();
		if(this.longueur() <= 2) {
			return x;
		}
		else {
			Element temp = this.premier.getSuivant();
			while(temp != this.dernier) {
				int mu = (temp.getPrecedent().getValeur() + temp.getValeur() + temp.getSuivant().getValeur()) / 3;
				x.ajouterFin(mu);
				temp = temp.getSuivant();
			}
			return x;
		}
	}

	public void annuleRedondances() {
		if(this.estVide()) {
			return;
		}
		Element temp = this.premier;
		while(temp.getSuivant() != null) {
			if(temp.getValeur() == temp.getSuivant().getValeur()) {
				this.supprimer(temp.getSuivant());
			}
			else {
				temp = temp.getSuivant();
			}
		}
	}
}
