Instead of pointers, you would store an index in the array of nodes:
struct node {
void * data;
uint32_t idx_next;
};
You are still dereferencing pointers, of course, but you have better locality, even after doing a lot of insertions and deletions.