Please, review the code:
#include <iostream>
using namespace std;
template <class T>
struct Node
{
Node(T data) : data(data), next(NULL), prev(NULL) {}
T data;
Node * next;
Node * prev;
};
template <class T>
class DoublyLinkedList
{
public:
DoublyLinkedList() : head(NULL), tail(NULL) {}
DoublyLinkedList(const DoublyLinkedList<T> & dll);
~DoublyLinkedList();
void addNode(T data);
//void insertNodeBefore(int data, int before);
//void insertNodeAfter(int data, int after);
void deleteNode(T data);
template <class U>
friend std::ostream & operator<<(std::ostream & os, const DoublyLinkedList<U> & dll);
private:
Node<T> * head;
Node<T> * tail;
};
template <class U>
std::ostream & operator<<(std::ostream & os, const DoublyLinkedList<U> & dll)
{
Node<U> * tmp = dll.head;
while (tmp)
{
os << tmp->data << " ";
tmp = tmp->next;
}
return os;
}
template <class T>
DoublyLinkedList<T>::~DoublyLinkedList()
{
Node<T> * tmp = NULL;
while (head)
{
tmp = head;
head = head->next;
delete tmp;
}
head = tail = NULL;
}
template <class T>
void DoublyLinkedList<T>::addNode(T data)
{
Node<T> * t = new Node<T>(data);
Node<T> * tmp = head;
if (tmp == NULL)
{
head = tail = t;
}
else
{
while (tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = t;
t->prev = tail;
tail = t;
}
}
template <class T>
void DoublyLinkedList<T>::deleteNode(T data)
{
Node<T> * tmp = head;
while (tmp && tmp->data != data)
{
tmp = tmp->next;
}
if (tmp)
{
if (tmp->prev && tmp->next) // no change to head or tail
{
tmp->prev->next = tmp->next;
tmp->next->prev = tmp->prev;
}
else if (tmp->prev) // change to tail
{
tmp->prev->next = tmp->next;
tail = tmp->prev;
}
else if (tmp->next) // change to head
{
tmp->next->prev = tmp->prev;
head = tmp->next;
}
delete tmp;
}
}
template <class T>
DoublyLinkedList<T>::DoublyLinkedList(const DoublyLinkedList<T> & dll)
{
Node<T> * tmp = dll.head;
while (tmp)
{
this->addNode(tmp->data);
tmp = tmp->next;
}
}
int main()
{
DoublyLinkedList<int> dll;
dll.addNode(1);
dll.addNode(2);
dll.addNode(3);
dll.addNode(4);
dll.addNode(5);
cout << dll << endl;
DoublyLinkedList<int> dll2(dll);
cout << dll2 << endl;
dll.deleteNode(3);
dll.deleteNode(1);
dll.deleteNode(5);
cout << dll << endl;
cout << dll2 << endl;
return 0;
}