I'd recommend "The Art of Molecular Dynamics Simulation" by D. C. Rapaport. The code samples are written in C. I'm not a huge fan of the programming style of the book, but at least it's not FORTRAN.
Having said that, my advice would be to take any book where neighbour lists are explained (for instance the Frenkel & Smit book, which I guess it's what you are using now) and just implement the algorithm, which is usually written in pseudo-code.
If you want a TL;DR, there are several types of neighbour lists. All of these rely on your interaction potential being 0 outside a certain range $r_c$.
- Verlet lists ($\mathcal{O}(N^2)$ - $\mathcal{O}(N^{3/2})$ but with a small-ish prefactor):
- do an $N^2$ sweep where for each particle you fill an array of neighbours that are closer than $r_c + r_v$, where $r_v$ is a parameter and save the current position of each particle (let's call it $\vec{r}_i(t_0)$.
- Evolve your simulation by using the list of neighbours to compute the forces.
- After each integration step check whether, for any particle $i$, $|\vec{r}_i(t) - \vec{r}_i(t_0)| \geq r_v / 2$. If it is then update all the lists (see step 1).
- Cell lists ($\mathcal{O}(N)$):
- Divide your simulation box in cells of linear size $l > r_c$.
- Use linked lists to assign particles to the cells.
- For each particle $i$, the list of neighbours is given by all the particles that are in $i$'s cells and in each of the (8 in 2D and 26 in 3D) neighbouring cells. Calculate the forces between $i$ and its neighbours.
- After each integration step check whether particles have crossed cell boundaries and update the data structure accordingly
- Verlet lists built with cell lists (usually the best choice, $\mathcal{O}(N)$ with a smaller prefactor than just using cells):
- Step 1 of the "Verlet lists" section is carried out by using cell lists. The linked lists that store the cell data structures are kept updated throughout the simulation
The reason why using Verlet lists instead of cell lists is (in MD simulations) better is that the average number of neighbours is smaller for the former than the latter. The difference is due to the fact that, for each particle, cell lists give you a list of neighbours that are in a volume $(3l)^3$, which, if $r_v$ is chosen wisely, is much larger than the volume of the Verlet sphere ($4/3 \pi (r_c + r_v)^3$). Therefore, on average, you compute much fewer distances with Verlet lists.