Here's what helped me the most...
Since you're a visual person, Google some visualized sorting algorithms, tree traversals, hashing, and etc to get a general idea of what's going on. After that, try making a simple program using different structures and experiment with different permutations of them--maybe for an example, you can make a linked list to start, then make it a circular linked list, then make it a doubly linked list, then make it a doubly circular linked list, and so on...
You just have to experiment with the structures, and as you do that, you'll start to see what data structures are appropriate for the applications you'll be developing.
Here are some nice references for you..
Sorting algorithms: http://www.sorting-algorithms.com/ Tree traversals: http://nova.umuc.edu/~jarc/idsv/lesson1.html Graph traversals: http://www.cosc.canterbury.ac.nz/mukundan/dsal/GraphAppl.html
As for efficiency (Big O analysis), it will come to you more or less naturally once you understand what is happening at the algorithmic level of each operation of the data structure.
One thing my university stresses is the development of our own implementation of data structures (which is bottom-up learning) without diving into the pre-established C++ templates (top-down learning). By making it from scratch, you really come to understand the overhead involved with inserting, removing, searching (traversing), and accessing data from a certain structure, and that will help your intuition when designing a system in the future.