Ho provato il tuo codice e in qualche modo funziona, solo due considerazioni:

Se controlli q->next, quando ti crei il nodo per la nuova lista anche info deve puntare a quella di q->next:
codice:
n = newnode();
n->info = q->next->info;
// non n->info = q->info;
n->next = NULL;
Seconda cosa, nella tua prima versione passare il puntatore al puntatore è corretto perchè in caso di eliminazione in testa potevi modificare anche il puntatore del main.
Ora quando fai
codice:
 p = l;
 l = l->next;
 free(p);
l è locale alla funzione. quindi quando fai l = l->next NON stai modificando l1 del main ma soltanto la copia nella build_list. Di conseguneza l1(main) continuerà a punatare all'elemento che hai "cancellato"