简介

链表就是链式存储数据的一种数据结构。双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针)。

   class DSChain<T>
{
//使用栈来进行废弃空间回收
private DSStack<int> _recycle; //数据需要三个数据来存储内容,分别存储前后节点索引和数据本身
private int[] _prev;
private T[] _ds;
private int[] _next; //链表头尾的索引,跟踪表尾主要方便LRU使用
private int _head;
private int _tail; public DSChain(int length)
{
_head = -1;
_tail = -1;
_prev = new int[length];
_ds = new T[length];
_next = new int[length]; _recycle = new DSStack<int>(length);
//将所有可用空间压入栈,也可改良当顺序空间耗尽后再读取栈中记录的回收空间
for (int i = 0; i < length; i++)
{
_recycle.Push(i);
}
} //搜索数据,返回所在索引
int Search(T data)
{
if (_head == -1) return -1;
int index = _head;
while (!_ds[index].Equals(data))
{
index = _next[index];
if (index == -1) return -1;
}
return index;
} public bool Insert(T data)
{
int index;
if (!_recycle.Pop(out index)) return false;
if (_head == -1)
{
_prev[index] = -1;
_ds[index] = data;
_next[index] = -1;
_tail = index;
}
else
{
_prev[index] = -1;
_ds[index] = data;
_next[index] = _head;
_prev[_head] = index;
}
_head = index;
return true;
} public bool Delete(T data)
{
int index = Search(data);
if (index == -1) return false; if (_prev[index] != -1) _next[_prev[index]] = _next[index];
else _head = _next[index]; if (_next[index] != -1) _prev[_next[index]] = _prev[index];
else _tail = _prev[index]; _recycle.Push(index);
return true;
} //LRU
public bool DeleteLast()
{
int index = _tail;
if (index == -1) return false;
_tail = _prev[index];
_next[_prev[index]] = -1;
_recycle.Push(index);
return true;
} //LRU访问方法,读取数据的同时调整数据在链表中位置
//链表这种数据结构实现LRU非常方便
public bool LRUAccess(T data)
{
int index = Search(data);
if (index == -1) return false;
if (_head == index) return true;
if (_tail == index) _tail = _prev[index]; _next[_prev[index]] = _next[index];
if (_next[index] != -1) _prev[_next[index]] = _prev[index]; _prev[index] = -1;
_next[index] = _head;
_prev[_head] = index;
_head = index;
return true;
}
}

最新文章

  1. UI第七节——UISlider详解
  2. python 筛选股票
  3. 发现磁盘的shell
  4. CSS 之 嵌套 margin-top 处理
  5. 《APUE》第三章笔记(1)
  6. 第一百零三节,JavaScript对象和数组
  7. Activity的生命周期与加载模式——Activity的4种加载模式
  8. NHibernate3剖析:Configuration篇之SessionFactory lambda配置
  9. js 操作数组
  10. [js]js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了
  11. 20135327郭皓--Linux内核分析第七周 可执行程序的装载
  12. scn 时间
  13. 如何高效的通过BP算法来训练CNN
  14. 详解PV、UV、VV、IP及其关系与计算
  15. SpringBoot集成dubbo实例
  16. STL - 容器 - Map(二)
  17. java并发编程:线程安全管理类--原子操作类--AtomicBoolean
  18. CTF中常见的 PHP 弱类型漏洞总结
  19. 代码生成利器:IDEA 强大的 Live Templates
  20. 使用ViewPager和FragmentPagerAdapter实现Tab

热门文章

  1. dotnet Core Asp.net 项目搭建
  2. 【干货】jsMind思维导图整合Easyui的右键菜单
  3. 【积累篇:他山之石,把玉攻】Mime 类型列表
  4. Andriod学习笔记4:mac下搭建 Eclipse+CDT 集成开发环境
  5. ExtJS 中类的选项 - config
  6. UWP Composition API - GroupListView(一)
  7. centos添加和删除用户及 xxx is not in the sudoers file.This incident will be reported.的解决方法
  8. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
  9. Oracle 查询出来的数据取第一条
  10. 采用Lambda表达式快速实现实体模型对象转换到DTO