Thought for the day:
Pointer traversals aren't free. They often cause cache misses and attaching a next and last pointer to a small data type like an int can triple your data in size (which doesn't help with the cache misses). Also, if your application is running very close to a critical point (i.e. nailing that 60hz refresh rate in a console game[0]) having the performance degrade a as memory fragments can kill you. Don't use a linked list just because you might need to add and remove elements from the middle.
If element order isn't important you can get the same advantages of a linked list by using a vector or array and moving the last element into the slot where you're removing an element. If element order is important, investigate how often you're adding and removing elements and consider using quicksort.
This isn't to say that you shouldn't use linked lists. Just consider using simpler data types when you're writing performance critical applications, particularly when you have a dataset that is accessed and changed constantly, but the elements are rarely added and removed.
--
[0] Games typically wait for the vertical blank on the display medium in order to swap buffers. On an NTSC television the refresh happens 60 times per second. If you wait for a VBlank then your game will always run at a harmonic of that frequency. The problem is that if you're really close to the 60fps line then it's easy for something to push you across the edge and drop you to 30fps.