was bored at work so i decided to implement a linked list. tell me what u think....all criticism is welcomed. i'm here to learn it does not have every single method. (wasn't that bored). oh and i want to know if there's a way u can avoid writingtemplate<class T>before every method besides usingdefine. below is just the class.

Code:template <class T> class LinkedList { private: struct node { T data; struct node * next, * prev; }; T getDataAtNode(int index); struct node * head, * end; public: LinkedList(); LinkedList(T data); void push(T data); T pop(); T operator[](int index); bool isEmpty(); void clear(); int length(); }; template <class T> T LinkedList<T>::getDataAtNode(int index) { int c = 0; struct node * iter = head; while(iter) { if (c++ == index) return iter->data; iter = iter->next; } return NULL; } template <class T> LinkedList<T>::LinkedList() { head = new node(); head->data = NULL; head->next = NULL; head->prev = NULL; end = head; } template <class T> LinkedList<T>::LinkedList(T data) { if (head != end) { head = new node(); end = head; } head->data = data; head->next = NULL; head->prev = NULL; } template <class T> T LinkedList<T>::operator[](int index) { return (getDataAtNode(index)); } template <class T> void LinkedList<T>::push(T data) { if(head->data == NULL) { head->data = data; } else { struct node * new_node = new node(); new_node->data = data; new_node->next = NULL; new_node->prev = end; end->next = new_node; end = new_node; } } template <class T> T LinkedList<T>::pop() { T data = end->data; if(end->prev) { end = end->prev; } else { end = head; head->data = NULL; } end->next = NULL; return data; } template <class T> bool LinkedList<T>::isEmpty() { return (head->data == NULL && head == end ? true : false); } template <class T> void LinkedList<T>::clear() { end = head; head->data = NULL; head->next = NULL; } template <class T> int LinkedList<T>::length() { int c = 0; struct node * iter = head; while(iter) { c++; iter = iter->next; } return c; }