Separate Declaration and Definition of private Node implementation in template Linked List
Your LinkedList does not manage its resources. You need a dtor, user-defined copy-ctor and user-defined assignment-operator at least.
Don't interact with the user from generic library code. Report any errors to the caller instead!
You probably want to provide the lists size to the public. Otherwise, consider whether optimizing removal of non-existent elements and insertion at the end by index is worth the overhead.
Only use std::endl if you really have to flush the stream. Remember flushing kills performance.
All your while-loops would be better off as for-loops.
createNode leaks memory if assignment to .data fails. Anyway, use aggregate-initialization, and you'll see that it's just not worth separating out into its own function:

auto p = new Node{data};



Regarding defining things in-class: There's nothing wrong with that, it's often even preferable, especially for templates.
If you define something outside a class in a header though, remember it won't automatically marked inline, meaning it must not be included in more than one compilation-unit.