My first thought was to build it up again from new conses, as you would in lisp. But then spotted a neat in-place way to do it too.
Found I absolutely had to draw a few scribbly diagrams first though.
1. copy head of list consed with nil
2. copy next item consed with previous
3. goto 2 while next item is not nil
That's N*(cost of a copy and a cons). Granted, it's not as fast in absolute terms, but the slowdown is a constant factor. You're certainly not doing N operations on each item.So in C, always in place unless explicitly specified otherwise.
Thanks