这篇文章写的很完整,很nice
转载:C++实现双向链表_洛克家族的博客-CSDN博客_c++双向链表
重点:
1.创建一个空节点,节点头尾指向自己。
2.查找的方法很nice,根据输入的index,进行正向和反向的查询。提高了不少效率。
template<typename T>
struct Node
{
public:
Node() {};
Node(T t) :data(t), pre(nullptr), next(nullptr) {};
Node(T t,Node* p,Node* n):data(t), pre(p), next(n) {};
public:
T data;
Node* pre;
Node* next;
};
template<typename T>
class DoubleLink
{
public:
DoubleLink();
~DoubleLink();
public:
bool push(int index, T t);
bool push(T t); //插入尾部
bool pop(int index);
bool pop(); //删除尾部
private:
Node<T>* GetNode(int index);
private:
Node<T>* node;
int count;
};
template<typename T>
DoubleLink<T>::DoubleLink() :count(0)
{
node = new Node<T>();
node->pre = node->next = node; //这一步是关键,初始的时候头尾指向自己
}
template<typename T>
DoubleLink<T>::~DoubleLink()
{
Node<T>* temp;
Node<T>* pnode = node->next;
while (pnode!=node)
{
temp = pnode;
pnode = pnode->next;
delete temp;
temp = nullptr;
}
delete node;
node = nullptr;
}
template<typename T>
Node<T>* DoubleLink<T>::GetNode(int index)
{
if (index<=0||index>count)
{
return nullptr;
}
//正向查找
if (index<=count/2)
{
int i = 0;
Node<T>* pNode = node->next;
while (i++<index)
{
pNode = pNode->next;
}
return pNode;
}
//反向查找
int j = 0;
Node<T>* pNode = node->pre;
while (j++<(count-index-1))
{
pNode = pNode->pre;
}
return pNode;
}
//节点插入index之后
template<typename T>
bool DoubleLink<T>::push(int index, T t)
{
Node<T>* pIndex = GetNode(index);
if (!pIndex)
{
return false;
}
Node<T>* pNode = new Node<T>(t, pIndex, pIndex->next);
pIndex->next->pre = pNode;
pIndex->next = pNode;
cout << "push num is " << pNode->data << endl;
count++;
return true;
}
//节点插入index之后
template<typename T>
bool DoubleLink<T>::push(T t)
{
Node<T>* pNode = new Node<T>(t, node->pre, node);
node->pre->next= pNode;
node->pre = pNode;
cout << "push num is " << pNode->data << endl;
count++;
return true;
}
//节点删除
template<typename T>
bool DoubleLink<T>::pop(int index)
{
Node<T>* pIndex = GetNode(index);
if (!pIndex)
{
return false;
}
pIndex->next->pre = pIndex->pre;
pIndex->pre->next = pIndex->next;
cout << "pop num is" << pIndex->data << endl;
delete pIndex;
count--;
return true;
}
//节点删除尾部
template<typename T>
bool DoubleLink<T>::pop()
{
Node<T>* pIndex = GetNode(count-1);
if (!pIndex)
{
return false;
}
pIndex->next->pre = pIndex->pre;
pIndex->pre->next = pIndex->next;
cout << "pop num is" << pIndex->data << endl;
delete pIndex;
count--;
return true;
}
int main()
{
DoubleLink<int>* link = new DoubleLink<int>();
link->push(1);
link->push(2);
link->push(3);
link->pop();
link->pop();
return 0;
}