”双向链表与队列“
“双向链表”是包含两个指针域,一个数据域,既有指向前驱的指针,还有指向后继的指针,同时可以从两个方向对链表进行遍历,访问各个节点。“双向链表”较”单链表“在插入和删除节点方面更为简单,但是所占的空间比“单链表”大。“队列”的实现之所以选择使用双向链表,是因为队列的特点是“先进先出”,如若使用顺序表则很大程度上的浪费空间。在这样的情境下,链表较顺序表更为合适。
根据“模板”的概念,设计并实现双向链表,进而实现队列的基本功能。下面是利用模板来实现双向链表的具体代码:
#pragma once
#include <assert.h>
//双向链表
template <class T>
struct ListNode
{
T _data;
ListNode<T> * _next;
ListNode<T> * _prev;
ListNode(const T& x)
:_data(x)
, _next(NULL)
, _prev(NULL)
{ }
};
template <class T>
class List
{
public:
List() //构造函数
:_head(NULL)
, _tail(NULL)
{ }
~List() //析构函数
{
Clear();
}
public:
void pushBack(const T & x) //尾插
{
if (_head == NULL)
{
_head = _tail = new ListNode<T>(x);
}
else
{
ListNode<T> * tmp = new ListNode<T>(x);
_tail->_next = tmp;
tmp->_prev = _tail;
_tail = tmp;
tmp->_next = NULL;
}
}
void popBack() //尾