双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
简单的画一个双向循环简易图:
下面就用C++实现一下基本操作
当然也有 C 语言 版的,只是单链表操作
(https://blog.youkuaiyun.com/Paranoid_cc/article/details/79707761)
先分开写吧
1、四个重要的函数:构造函数、拷贝构造函数、赋值运算符重载、析构函数。
//构造函数
List(size_t n,const DataType& data)
{
_CreateHead();
for (size_t i = 0; i < n; ++i)
PushBack(data);
}
List(DataType* first, DataType* last)
{
_CreateHead();
while (first != last)
PushBack(*first++);
}
//拷贝构造函数
List(const List& L)
{
_pHead = new Node();
_pHead->_pNext = _pHead;
_pHead->_pPre = _pHead;
Node* pCur = L._pHead->_pNext;
while (pCur != L._pHead)
{
this->PushBack(pCur->_data);
pCur = pCur->_pNext;
}
}
//赋值运算符重载
List& operator=(const List& s)
{
if (this != &s)
{
this->Clear();
Node* pCur = s._pHead->_pNext;
while (pCur != s._pHead)
{
this->PushBack(pCur->_data);
pCur = pCur->_pNext;
}
}
return *this;
}
//析构函数
~List()
{
Clear();
delete _pHead;
_pHead = NULL;
}
2、对链表的数据的操作(删除和插入)
//尾插
void PushBack(const DataType& data)
{
Node* pNewNode = new Node(data);
pNewNode->_pPre = _pHead->_pPre;
pNewNode->_pNext = _pHead;
_pHead->_pPre = pNewNode;
pNewNode->_pPre->_pNext = pNewNode;
}
//尾删
void PopBack()
{
if (Empty())
return;
Node* pDelNode = _pHead->_pPre;
pDelNode->_pPre->_pNext = _pHead;
_pHead->_pPre = pDelNode->_pPre;
delete pDelNode;
}