How would you properly implement the copy and move constructors?
Moving is easy: copy the victim's pointer to the target, then null the victim's to indicate that it no longer owns anything. And, of course, copy the other values.
For copying, you need to choose the semantics you want: unique ownership (in which case don't allow copying), shared ownership (in which case increment a reference count, and change the destructor to decrease it), deep copying (in which case allocate a new object, copying the old one), or something else.
Normally you would just invoke the copy constructor of the object that needs to be copied, but since it's the very same class, how would you handle this properly?
That's not necessarily a problem. If the chain of pointers ends somewhere, you'll just end up recursively copying everything on that chain; although it might be better to write a loop to avoid indefinite recursion. If it doesn't end, then it must be cyclic, so you'd need to check whether you get back to the object you started with.