A weak_ptr is not a direct replacement for a plain pointer, because it has to be associated with some shared_ptr that actually manages the memory.
You can't just drop in shared_ptr's because nodes refer to each other.
With a plain pointer it is trivial to establish who owns the nodes: the list class itself.
With smart pointers it's making my head hurt. So each node owns the following node, but doesn't own the previous node?