/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class No<T> {

	T elemento;
	No<T> proximo;
	No<T> anterior;

	public No(T elemento, No<T> anterior, No<T> proximo) {
		this.elemento = elemento;
		this.proximo = proximo;
		this.anterior = anterior;
	}

	public No(T elemento) {
		this.elemento = elemento;
		proximo = null;
		anterior = null;
	}
	
	@Override
	public String toString() {
		return elemento.toString();
	}
}

class Lista<T> {

	private No<T> primeiro;
	private int tamanho;
	
	public void adicionar(T item){
		No<T> novo = new No<T>(item);
		
		if (primeiro == null){
			primeiro = novo;
			return;
		}
		
		No<T> curr = primeiro;
		
		while (curr.proximo != null){
			curr = curr.proximo;
		}
		
		curr.proximo = novo;
		novo.anterior = curr;
	}
	
	public boolean remover(T item) {
	    if (primeiro.elemento.equals(item)) {
	        primeiro = primeiro.proximo;
	        if (primeiro != null){
	        	primeiro.anterior = null;
	        }
	        return true;
	    }

	    No<T> n = primeiro;
	    T aux1 = null;
	    T aux2 = null;

	    while (n.proximo != null) {
	        if (item.equals(n.proximo.elemento)) {
	            aux1 = n.proximo.elemento;
	            n.proximo = n.proximo.proximo;
	            break;
	        }

	        n = n.proximo;
	    }

	    //n = n.proximo;

	    while (n.anterior != null) {
	        if (item.equals(n.anterior.elemento)) {
	            aux2 = n.anterior.elemento;
	            n.anterior = n.anterior.anterior;
	            break;
	        }

	        n = n.anterior;
	    }

	    if (aux1 == aux2) {
	        tamanho--;
	        return true;
	    }

	    return false;
	   
	}
	
	public void mostrar(){
		No<T> curr = primeiro;
		
		while (curr != null){
			System.out.print(curr.toString() + " -> ");
			curr = curr.proximo;
		}
		
		System.out.println("NULL");
	}
}

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Lista<Integer> lista = new Lista<>();
		
		lista.adicionar(5);
		lista.adicionar(15);
		lista.adicionar(2);
		lista.adicionar(9);
		
		lista.mostrar();
		
		lista.adicionar(23);
		lista.adicionar(4);
		lista.adicionar(18);
		
		lista.mostrar();
		
		lista.remover(15);
		
		System.out.println("Depois de remover o 15");
		lista.mostrar();
		lista.remover(18);
		System.out.println("Depois de remover o 18");
		lista.mostrar();
		lista.remover(5);
		System.out.println("Depois de remover o 5");
		lista.mostrar();
		lista.remover(2);
		lista.remover(9);
		lista.remover(23);
		lista.remover(4);
		System.out.println("Depois de remover todos");
		lista.mostrar();	
	}
}