I would look at the std :: list interface, which is an implementation of C ++ related lists. It seems that you are incorrectly approaching the template of your Linked list. Ideally, your linked list should not care about ownership semantics (that is, whether it will be created using raw ptrs, smart pointers, or variables allocated on the stack). The following is an example of semantics of ownership with STL containers. However, there are better examples of STL and property rights from more reputable sources.
#include <iostream>
A good exercise to understand owning, allocating / freeing memory, and shared pointers is to make a tutorial in which you implement your own smart pointers. Then you will definitely understand how to use smart pointers, and you will have one of those xen moments where you will understand how almost everything in C ++ returns to RAII (resource ownership).
So, back to the essence of your question. If you want to stick to Nodes of type T, do not wrap the node with a smart pointer. The node destructor should remove the main raw pointer. The raw pointer can point to the smart pointer itself, indicated as T. When you call the destructor of the LinkedList class, it iterates through all the nodes using Node :: next and calls delete node; after getting a pointer to the next node.
You can create a list in which nodes are smart pointers ... but this is a very specialized linked list, which is probably called SharedLinkedList or UniqueLinkedList with very different semantic properties for creating an object, popping up, etc. As an example, a UniqueLinkedList will move a node in the return value when the value appears to the caller. To perform metaprogramming for this task, you will need to use partial specialization for different types of transmitted T. Example, something like:
template<class T> struct LinkedList { Node<T> *head; };
Now you are starting to implement your own STL! You can already see the potential problems mentioned in the comments on your question with this approach. If the nodes have shared_ptr next, this will call this node's shared destructor, which will call the next common node destructor, etc. (Stack overflow due to recursion possible). Therefore, I do not really like this approach.