For nodes I would use a private (or maybe protected) nested struct. Nodes shouldn't be visible to the user of your list class but only used internally by your class and thus a struct is fine. Remember that a struct in C++ works almost like a class, the only difference is that the default access label is public for structs and private for classes. This means a struct can have constructors and all other useful things classes have.
Say you're making a doubly-linked list class storing ints, the Node-struct could be (but usually templated of course):
Code:
struct Node
{
Node() : m_next(NULL), m_previous(NULL), m_data(0) {}
Node(int data) : m_next(NULL), m_previous(NULL), m_data(data) {}
Node *m_next;
Node *m_previous;
int m_data;
};
As I see it, you're not violating any "OO rules" with a struct like this since it's a type that's private to the class. For types used directly by end-users, I rarely use structs, though.