Beh, non è la stessa cosa perché m_pHead è inteso come variabile membro privata e pertanto globale (== visibile) tra tutti i metodi, pensavo fosse esplicito perché l'ho scritta utilizzando la notazione: m_(eccetera).
Ma l'ho impiegata solo per rendere chiaro che la testa della lista deve essere visibile e condivisa all'interno di ogni metodo. ...ad esempio anche utilizzando il puntatore "testa" proprio come fai nella funzione 
inserisci_in_testa, allora salta fuori una cosa simile:
bool DeleteOneNode(nodo *& testa, size_t val)
{
	/*	Elimina un solo e unico nodo.
	 *
	 *		size_t val		nodo per valore da eliminare.
	 *
	 *	Return value
	 *		true 	se un nodo è stato eliminato, 
	 *		false 	se il nodo non è stato trovato.
	 */
	nodo *P = testa;
	nodo *prec = nullptr;
	if( !P ) // Lista vuota.
		return false;
	if( P->val == i ) // Se è il primo nodo:
	{
		testa = P->ptr;		// imposta il nodo sucessivo come nuova testa della lista;
		delete P;			// libera il primo elemento.
		// P = testa;		// Inutile in tal caso perché termina con il ritorno di true.
		return true;
	}
	while( P ) // Non è il primo nodo:
	{
		if( P->val == i )
		{
		 	// Sicuramente ha saltato il primo ciclo e pertanto 'prec' non può essere nullo.
			prec->ptr = P->ptr;		// Collega il nodo precedente al sucessivo.
			delete P;				// Libera il nodo corrente.
			return true;
		}
		prec = P;
		P = P->ptr;
	}
	return false;
}
Mi esprimo nei commenti al codice di questa funzione 
DeleteOneNode che adopero a titolo di esempio e in cui noterai che ho voluto semplificare il codice. Prova ad adattarla alle tue esigenze e fammi sapere.