双向链表的概述
写链表首先要对链表的构成有一个很好的了解,那么完成一个链表我们需要完成什么呢?
节点的定义
对于双向链表,每一个节点都与其前驱、后继的连接,那么这个链接我们通过指向节点的指针来完成。指向节点的指针在解引用之后就是一个节点对象。方法的定义
双向链表因为具有头与尾,所以需要实现的方法有:
在末尾插入,删除元素
在链表首部插入、删除元素
可以像访问数组元素一样使用[]
运算符对链表元素进行访问迭代器的定义
首先了解什么是迭代器:In computer programming, an iterator is an object that enables a programmer to traverse a container, particularly lists. Various types of iterators are often provided via a container’s interface.
An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (with at least the increment (++) and dereference (*) operators).最典型的迭代器就是指针,在数组之中可以使用指针对数组进行遍历。但在其他的容器中简单的指针并不能完成这样的活动,所以我们应该使用迭代器来对不同容器完成统一的遍历访问功能。
双向链表的实现:
节点的定义使用:
这一个部分,我们定义了MyList_Node 的结构体作为一个节点的存储单元。其中有三个属性 value 存储值,剩余两个为指向MyList_Node 节点的指针。prev指向此节点的前驱,next 指向此节点的后继。
template<typename T>
struct MyList_Node {
MyList_Node<T>* prev;
MyList_Node<T>* next;
T value;
};
MyList的主体:
class MyList {
public:
//MyList_iterator<T>---在MyList里作为泛型T实例化类模板。原本的东西太长所以取一个别名
typedef MyList_iterator<T> iterator;
protected:
MyList_Node<T>* TailNode;//链表尾指针
size_t len;
public:
MyList() :len(0) {
TailNode = new MyList_Node<T>;
TailNode->next = TailNode;
TailNode->prev = TailNode;
}
~MyList()