Quindi? il costruttore di copia deve costruire una nuova lista partendo dalla lista passata come parametro. Siccome l'unico dato che tu hai nella lista è un puntatore al nodo iniziale devi semplicemente assegnare a questo nodo il valore del nodo iniziale della lista passata come parametro.
foo::foo(const foo& rhs)
: l(rhs.l)
{
}
Per quanto riguarda l'operatore di assegnazione la storia non cambia di molto. Devi solo vedere se stai assegnando la stessa lista allo stesso oggegtto.
foo & foo::operator=(const foo & rhs)
{
if(this != &rhs) // protezione contro auto assegnazione.
{
l = rhs.l;
}
return *this;
}