inserte un nuevo nodo en cualquier índice dentro de una sola lista enlazada

¿Cómo hago para crear una función que me permita insertar un nuevo nodo en cualquier índice dentro de una lista vinculada? Aquí está la estructura:

struct node {
    int data;
    struct node* next;
};

Aquí está la función, tenga en cuenta que solo hay un doble puntero, índice y parámetro de datos.

void insertN(struct node** headRef, int index, int data);

y esto es lo que debería ser el resultado después de llamar a insertN:

[ HEAD ] -> [ 0 ] -> [ 15 ] -> [ 10 ] -> [ 5 ] -> [ NULL ]
insertN( &head, 3, -44);
[ HEAD ] -> [ 0 ] -> [ 15 ] -> [ 10 ] -> [ -44 ] -> [ 5 ] -> [ NULL ]
insertN( &head, 4, -55);
[ HEAD ] -> [ 0 ] -> [ 15 ] -> [ 10 ] -> [ -44 ] -> [-55 ] -> [ 5 ] -> [ NULL ]
insertN( &head, 0, -66);
[ HEAD ] -> [ -66 ] -> [ 0 ] -> [ 15 ] -> [ 10 ] -> [ 5 ] -> [ NULL ]

Sé cómo agregar un nuevo nodo a la cabeza, pero no en ningún punto. la forma en que estaba pensando era

void insertN(struct node** headRef, int index, int data) {
    struct node* new;
    int i;
    for (i = 0; i <= index; i++) {
        if (i == index) {
            /* move what was here to next node and put in new node */
        }
    }

    return;
}

Simplemente no estoy seguro de cómo hacer todo esto, porque si algo estaba en el nodo, también tengo que mover todos los nodos posteriores.

Respuestas a la pregunta(2)

Su respuesta a la pregunta