节点类
#ifndef node_H
#define node_H
template<typename T>
class node
{
public:
node<T> *pre; //上一节点指针
node<T> *next;//下一节点指针
T val;
node():val(T()),pre(nullptr),next(nullptr){}
node(T v):val(v),pre(nullptr),next(nullptr){}
};
#endif
迭代器类
#ifndef my_iterator_H
#define my_iterator_H
#include"node.h"
class my_iterator
{
friend class dLinkList<T>;
private:
node<T> *it;
my_iterator(node<T> *pt):it(pt){} //设为私有,不允许用户调用
public:
my_iterator()=default;
my_iterator& operator++()//前置++
{
it=it->next;
return *this;
}
my_iterator& operator--() //前置--
{
it=it->pre;
return *this;
}
my_iterator operator++(int)//后置++
{
my_iterator tem(*this);
it=it->next;
return tem;
}
my_iterator operator--(int) //后置--
{
my_iterator tem(*this);
it=it->pre;
return tem;
}
bool operator==(const my_iterator& other)//重载==
{
return it==other.it;
}
bool operator!=( const my_iterator& other)//重载!=
{
return it!=other.it;
}
T operator*()
{
return it->val;
}
};
#endif
双向循环链表类
#ifndef dLinkList_H
#define dLinkList_H
#include"node.h"
#include<iostream>
using namespace std;
template<typename T>
class dLinkList
{
private:
node<T> *head; //头节点
size_t length; //链表长度
void dInsert(node<T> *curr,T val) //插入的辅助函数,把新节点插入curr前
{
node<T>* tem=new node<T>(val);
node<T>* preNode=curr->pre;
preNode->next=tem;
tem->pre=preNode;
tem->next=curr;
curr->pre=tem;
}
void dDelete(node<T> *curr)//删除的辅助函数,删除curr节点
{
node<T> *preNode=curr->pre;
preNode->next=curr->next;
curr->next->pre=preNode;
delete curr;
}
public:
#include"my_iterator.h" //使迭代器成为内部类
dLinkList():length(0) //初始化链表
{
head=new node<T>;
head->next=head;
head->pre=head;
}
void push_back(T val) //尾插法
{
dInsert(head,val);
length++;
}
void push_front(T val) //前插法
{
dInsert(head->next,val);
length++;
}
my_iterator begin() //返回第一个节点(头节点的下一个节点)的迭代器
{
return my_iterator(head->next);
}
my_iterator end()
{
return my_iterator(head);//返回尾节点的下一个节点(头结点)迭代器
}
void insert(my_iterator it,T val)//在迭代器it的位置插入一节点
{
dInsert(it.it,val);
length++;
}
void erase(my_iterator it) //在删除迭代器it的位置的节点
{
dDelete(it.it);
length--;
}
~dLinkList()//清空链表,释放内存
{
node<T> *tem=head->next;
node<T> *p;
while(tem!=head)
{
p=tem;
tem=tem->next;
delete p;
}
delete head; //删除头节点
}
};
#endif
测试代码:
#include<iostream>
#include"dLinkList.h"
#include<algorithm>
int main()
{
dLinkList<int> dll;
dll.push_front(1);
dll.push_front(0);
dll.push_back(2);
dll.push_back(3);
for(int x: dll)
{
cout<<x<<ends; //0 1 2 3
}
cout<<endl;
dLinkList<int>::my_iterator it=dll.begin();
dll.insert(it,-1);//在第一个元素前插入-1
it=dll.end();
it--;
dll.erase(it);//删除最后一个元素
for(int x: dll)
{
cout<<x<<ends;//-1 0 1 2
}
return 0;
}