yeah, the answer is what CSoup suggested. Here's the basic layout of a skip list.
A ---- ---- C
| |
A ----B---- C
| | |
A ----B-----C----D
EDIT: Of course, my spacing doesn't work out ok. but you get the idea
As a quick reminder, assuming that you built a random skip list the algorithm for inserting the nodes is simple:
int insert(top left node, node to be inserted)
1) go right till the next node is larger than the current node
2) if current node can go down, then call insert(current node.down, node to be inserted) (if returns 1 then toss a coin. If the result is 1, insert the new node between the current node and the next node, and return 1. otherwise return 0).
3) (we're at the bottom layer): insert the node between the one behind it and the one after it. return 1.
That's just an example for random skip lists. In general, every layer of a skip list includes at least all of the elements of the layer above it, in general it contains twice as many (so that searches are indeed in log time). As a result of this, all data is stored in a sorted order at the lowest level.
If you want an easy way to go through all the list just go straight down from the first node, until you can't go down anymore, and then iterate over the bottom layer. As a note: many skip list implementations use sentinels at both ends (-Infinity at the left end, and +Infinity at the right end).