之前的两篇文章分别用顺序表和单链表来实现线性表。今天要介绍的是双链表,原理和单链表相同区别在于双链表有两个引用分别指向上一个数据和下一个数据,这里画一个图简单看一下
双链类的示意图,相对于单链多了一个引用,指向上一个数据
这是双链数据的组成,他们是这样互相引用的
双链表相对于单链表的优劣:
- 优势
- 读取速度,单链表的读取每次都是从表头开始,或者从表尾开始,效率低,双链可以根据索引判断从表头或者表尾开始
- 写入速度,对于后驱引用节点来说,每一次写入都需要遍历到表尾,效率太低,改成前驱引用节点会改善很多,但是读取速度还是没有改变,依然效率低下,但是双链表可以直接从表为写入,效率超高
- 劣势
- 其实我感觉双链是完爆单链的,除了双链的数据量会大一些,毕竟多储存了一个引用
上代码
第一步、定义一个接口
双链表也是线性表的实现之一,所有这个接口和上一篇单链的是一样的
//线性表接口定义:线性表的实现有 顺序表、单链表{双向链表、循环链表}
interface IListDs<T>
{
int GetLength();//求长度
void Clear();//清空操作
bool IsEmpty();//判断线性表是否为空
void Add(T item);//添加数据
void Insert(T item, int index);//插入数据
T Delete(int index);//删除数据
T GetElement(int index);//取数据
T this[int index] { get; }//索引器取数据
int Locate(T value);//按照值查找数据
}
第二部、定义存储数据的类
这个类和单链的类是几乎一样的,只是多了一个前引用而已
/// <summary>
/// 双向链表的结点类
/// </summary>
/// <typeparam name="T"></typeparam>
class DbNode<T>
{
private T data;//储存数据(数据域)
private DbNode<T> prev;//前引用
private DbNode<T> next;//后引用
/// <summary>
/// 构造方法,值和后引用
/// </summary>
/// <param name="value"></param>
/// <param name="dbNode"></param>
public DbNode(T value,DbNode<T> dbNode)
{
data = value;
next = dbNode;
}
/// <summary>
/// 构造方法,后引用
/// </summary>
/// <param name="dbNode"></param>
public DbNode(DbNode<T> dbNode)
{
next = dbNode;
}
/// <summary>
/// 构造方法,值
/// </summary>
/// <param name="value"></param>
public DbNode(T value)
{
data = value;
next = null;
}
/// <summary>
/// 构造方法,默认
/// </summary>
public DbNode()
{
data = default(T);
next = null;
}