Codificar una función para copiar una lista enlazada en C ++

Necesito implementar una función auxiliar, llamada copyList, que tenga un parámetro, un puntero a un ListNode. Esta función debe devolver un puntero al primer nodo de una copia de la lista enlazada original. Entonces, en otras palabras, necesito codificar una función en C ++ que tome un nodo de encabezado de una lista vinculada y copie toda la lista vinculada, devolviendo un puntero al nuevo nodo de encabezado. Necesito ayuda para implementar esta función y esto es lo que tengo ahora.

Listnode *SortedList::copyList(Listnode *L) {

    Listnode *current = L;  //holds the current node

    Listnode *copy = new Listnode;
    copy->next = NULL;

    //traverses the list
    while (current != NULL) {
       *(copy->student) = *(current->student);
       *(copy->next) = *(current->next);

        copy = copy->next;
        current = current->next;
    }
    return copy;
}

Además, esta es la estructura de Listnode con la que estoy trabajando:

struct Listnode {    
  Student *student;
  Listnode *next;
};

Nota: otro factor que estoy encontrando con esta función es la idea de devolver un puntero a una variable local.