You don't need a new way of storing them, just just need a new way of accessing them. Storing the data in lists in the chunks is fine. You just need a way to index into them at the world level.
The world should contain a list of chunks currently loaded, and the chunks contain lists of voxels. Each chunk should be the same size (contain the same volume of the world). Now when you want to access a specific voxel in the world, you only need to convert world coordinates into two pieces of data: chunk and chunk coordinates.
Imagine a 2D example. You have a 2D world where each chunk contains 10 x 10 pixels. At the world level you want to access the pixel data for pixel (342,103). First you need to find the chunk that contains the data. You can easily find that because you know each chunk contains 10 x 10 pixels. To get chunk coordinates, just divide by the number of pixels per chunk, (int)342/10 = 34
and (int)103/10 = 10
, giving you chunk (34,10).
Now you just need to get the coordinates within the chunk. Those coordinates can easily be found by getting the remainder after the division, i.e. a modulo operation. 342%10 = 2
and 103%10 = 3
, giving you pixel (2,3).
That means world position (342,103) can be found in chunk (34,10) at position (2,3).
Think of it like graph paper, where the larger thicker lines show you where the chunks are and the smaller grids are the data each chunk holds.

The system used to access each can be very similar. It's just that one system holds chunks, while the other holds voxels.
chunk.get(-1, 0, 0)
basically returnchunk.left.get(chunk_width - 1, 0, 0)
so that you dont have to write any hacky code in your collision detection/anywhere else. – Nov 13 '13 at 15:29