基础知识
双向循环链表和单向链表一样是一种线性表数据结构,但和单向链表不同,双向循环链表需要增加两个指针域分别指向前驱节点和后继节点,同时首尾节点分别指向彼此。双向链表的实现和单向链表相比稍微有点复杂,但是双向循环链表具有前向和后向遍历能力并且可以从任意节点开始循环遍历所有的节点。双向循环链表的指针域增加也造成了更多的空间浪费,使空间利用率进一步降低。
双向循环链表数据结构的定义
使用单向链表的ADT,采用C++模板的方式编写双向循环链表的操作。
1 | template <typename DataType> |
如上所示,在链表类中有两个数据成员,分别为listSize和head。listSize保存当前链表大小,对一些函数可快速判断输入是否合法;head保存链表头节点,如果链表为空则置为空指针。
下面依次实现各函数:
- 清空链表
1 | template <typename DataType> |
- 判断列表是否为空
1 | template <typename DataType> |
- 判断是否为最后一个元素
1 | template <typename DataType> |
- 查找一个元素并返回地址
1 | template <typename DataType> |
- 查找第n个元素,下标从1开始,返回地址或者nullptr
1 | template <typename DataType> |
- 删除一个节点,如果不存在则不做任何事
1 | template <typename DataType> |
- 删除第n个节点,如果不存在则不做任何事
1 | template <typename DataType> |
- 插入一个节点, n<0或者>链表长度代表直接插到末尾,其他代表插到第n个节点后
如果只有一个节点将该节点的首尾均指向自己。
1 | template <typename DataType> |
- 返回链表长度
1 | template <typename DataType> |
- 析构函数
1 | template <typename DataType> |
代码测试
以下对上述代码进行简单的测试,测试代码如下:
1 |
|