Sinceramente trovo un po' caotico il tuo codice(non me ne volere ), infatti ho difficoltà a capire quali sono le tue intenzioni in alcuni passaggi. Perchè se utilizzi più volte il caricamento di una lista non crei una funzione apposita e la richiami ogni volta che ne hai bisogno, così oltre risparmiare tempo miglioreresti anche la leggibilità del codice.

Poi non capisco molto perchè dici che conservi il campo puntatore...

Io la funzione per caricare la lista l'avrei fatta così:
codice:
lista* initLista(){
	bool condition = true;
	char c;
	lista* li = NULL;
	while(condition)
	{	
		lista* p = new lista;
		cout << "Inserisci un valore: ";
		cin >> p->num;
		p->punt = li;
		li = p;
		cout << "Vuoi inserire un nuovo valore?(s/n)";
		cin >> c;
		if(c=='n' || c=='N')
			condition = false;
	}
	return li;
}