Tela + Lista Encadeada Simples

pessoal no meu projeto eu tenho que criar três classes para trabalhar com listas simplesmente encadeada. Então eu criei a primeira classe chamada No que contem os set´s e get´s… Na segunda classe coloquei o nome de Lista onde tem o metodo de inserção. e a terceira classe chamada teste. Nela coloco os valores…Só que meu problema está na apresentação do resultado. tenho que inserir os valores e mostrar na tela. Fiz estes codigos para a resolução do problema pedido. Vou colocar os pedaços importantes


/* Metodo que mostra na tela os dados.
public String tela(){


		String exit = "";
		exit = "Informacoes do no: \n";
		exit +="referencia = " + this +"\n";
		exit +="prox = "+ prox + "\n";
		exit +="valor do no = " + dado + "\n";
		return exit;
	}

Na class Lista eu uso o metodo mostra pra correr todo a lista e mostrando na tela

public void mostra(){
  	
  	No tmp = new No();
  	tmp = primeiro;
  	if(vazia()){
  	    primeiro.tela();
  	}else{
  		while(tmp.getProx()!=null){
  			primeiro.tela();
  			tmp = tmp.getProx();
  		}
  	}
  	  
  }

e por ultimo utilizo a classe teste

while(c<=q){
			num = JOptionPane.showInputDialog("Escreva o valor do no");
			n = Integer.parseInt(num);
			l.insere(n);
			c++;
		}
		l.mostra();

Pode parecer grande minha duvida mas acredito que seja pequeno a mudança. To precisando de uma luz para saber onde eu estou errando.
grato pela ajuda.

Se eu entendi bem o seu código, quanod você o executa, ele está mostrando sempre o mesmo valor prá todos elementos, certo?

Se for assim, um dos problemas está aqui:

while(tmp.getProx()!=null){  
//você está percorrendo com tmp, mas está imprimindo
//sempre o primeiro valor. basta substituir primeiro.tela()
//por tmp.tela()
primeiro.tela();  
tmp = tmp.getProx();  

Outra coisa: se ela é vazia, então primeiro é null, certo? Nesse caso, qual o sentido dessa linha:

primeiro.tela(); 

Mais uma coisa: pela condição do seu loop, o último elemento nunca será impresso, porque quando você estiver nele, o próximo será null e o código do loop não será executado:

//substitua
while(tmp.getProx()!=null){  

//por
while(tmp != null){  

Vê se funciona…