据说单链表没有回路,那么双链表也出现了,既包括后继指针,又加入了前驱指针,某个元素可以寻找他上面一个元素,也可以寻找到下一个元素。当然双链表也是链表的一种。
物理存储结构:不一定是连续的存储区域
逻辑存储结构:逻辑上存储是连续的
使用场景:跟单链表一样,适用于对数据的大量新增和删除元素,对访问元素无要求,预先无法确定数据量的程序
首先创建存储元素结构
/// <summary>/// 双链表/// </summary>class DLinkList{public string data;//上一个节点public DLinkList prior;//下一个节点public DLinkList next;}
创建操作类和表头
/// <summary>/// 双链表操作/// </summary>class DLinkListClass{//创造双链表的头元素public DLinkList dhead = new DLinkList();
}
插入数据:同样跟单链表一样有两种方式插入,时间空间复杂度为:O(n)
#region 建立双链表-头插法 O(n)public void CreateListFrist(string[] split){DLinkList s;dhead.next = null;for (int i = 0; i < split.Length; i++){s = new DLinkList();s.data = split[i];//新增的这一级找到以前head指向的下一级,作为nexts.next = dhead.next;//头部的下一级的prior以前指向的是head,那么现在这级的prior先找到新插入的元素if (dhead.next!=null){s.next.prior = s;}//head的下一级指向新增项dhead.next = s;//新增项的prior上一级指向heads.prior = dhead;}}#endregion#region 建立双链表-尾插法 O(n)public void CreateListEnd(string[] split){DLinkList p, s;p = dhead;for (int i = 0; i < split.Length; i++){//插入新项s = new DLinkList();s.prior = p;s.data = split[i];//尾部的下一级指向新增项p.next = s;//新增项转换成尾部p = s;}p.next = null;}#endregion
输出双链表,时间空间复杂度为:O(n)
#region 输出双链表表 O(n)public string DispList(){string str = "";DLinkList p;p = dhead.next;while (p != null){str += p.data + " ";p = p.next;}return str;}#endregion
输出双链表的长度,时间空间复杂度为:O(n)
#region 双链表的长度 O(n)public int ListLength(){int i = 0;DLinkList p;p = dhead;while (p.next != null){i++;p = p.next;}return i;}#endregion
获取元素item项的值,时间空间复杂度为:O(n)
#region 获取第item项的值 O(n)public bool GetElem(int item, ref string e){DLinkList p = dhead;int j = 0;if (item < 1){return false;}//循环找到item的位置while (j < item && p != null){j++;p = p.next;}//判断item位置是否存在if (p == null){return false;}else{e = p.data;return true;}}#endregion
根据元素值获取位置,时间空间复杂度为:O(n)
#region 根据元素值获取item位置 O(n)public int LoateElem(string e){DLinkList p = dhead.next;int item = 0;//开始找元素里面的data与e相等while (p != null && p.data != e){//计数item++;//下一个元素p = p.next;}//如果双链表没有元素或者没有找到与双链表匹配的值,输出为0if (p == null){return 0;}else{return item;}}#endregion
指定位置插入元素,时间空间复杂度为:O(n)
1.这里先找到插入元素位置,获取前一个元素
2.将这个元素的后继地址给新增元素的后继地址
3.然后把下一个元素的前驱地址换成新元素的地址
4.然后将新元素的前驱地址换成前一个元素的地址
5.前一个元素的后继地址换成新元素地址
#region 在item插入值 O(n)public bool ListInsert(int item, string values){DLinkList p, s;p = dhead;int j = 0;while (j<item-1 && p!=null){p = p.next;j++;}if (p==null){return false;}else{//创造一个新增元素s = new DLinkList();s.data = values;//新增项找到下一级s.next = p.next;//新增项的下一级的prior找到新增元素if (s.next!=null){s.next.prior = s;}//新增项的prior上一级s.prior = p;//新增项上一级的nextp.next = s;return true;}}#endregion
删除定点的元素,时间空间复杂度为:O(n)
1.寻找到这个元素的位置
2.这里先找到删除元素的上一级,这个上一级的后继地址指向删除元素的下一级元素
3.然后这个上一级的前驱元素指向删除元素的上一级
#region 删除item项public bool ListDelete(int item, ref string values){DLinkList p, s;p = dhead;int j = 0;while (j<item-1 && p!=null){p = p.next;j++;}if (p==null || p.next==null){return false;}else{s = p.next;values = s.data;//删除项的上一级next寻找删除项下一级p.next = s.next;//删除项的下一级的prior寻找删除项的上一级if (p.next != null){s.next.prior = p;}//释放空间s = null;return true;}}#endregion
结论:双链表相比顺序表新增删除省了不少事,不用每次都要重新操作后面的移位问题,但是相对于链表内存消耗多了指针域

优点:没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关。插入和删除元素速率高。

缺点:占用额外的空间以存储指针(浪费空间)。随机存取元素速率低。双链表要找一个数,必须要从表头开始找起,存取率元素的速率非常的低。

循环双链表,操作跟双链表一样,只是注意尾元素的后继不是指向空地址,而是指向head头元素,头元素的前驱地址指向的是尾元素的地址,这里的头元素在循环链表中做了一个参照物的作用,如果你不知道头元素在哪里,可能操作的时候会出现一直循环下去,最终会导致程序崩溃。

C#数据结构-双链表相关推荐

  1. 数据结构-双链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...

  2. 数据结构--双链表的创建和操作

    http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一. ...

  3. c# 数据结构 ---双链表

    再来个双链表,其实和单链表差不多拉,循环链表也是,只是把尾元素指向Header就OK了.所以就不贴循环链表了.   1 /**//// <summary>   2    /// 双链表的节 ...

  4. 算法基础—数据结构—双链表

    双链表顾名思义就是一个从左到右的指针和一个从右到左的指针. 这里列一些模板 // e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点 int e[N], ...

  5. 数据结构——双链表(C语言详述通用双链表)

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  6. 天勤考研数据结构———双链表操作

    定义双链表的结构体类型 typedef struct DLNode{     int data;     struct DLNode *next;     struct DLNode *prior; ...

  7. 数据结构 - 双链表的头插法和后插法

    1.单链表的局限性 -> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题.使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单 ...

  8. 【算法和数据结构】_13_小算法_双链表

    没什么新的内容,把自己写的练习代码贴出来,供大家批判. 1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include ...

  9. 【手写数据结构】双链表最详细图解

    原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的一键三连! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以 ...

最新文章

  1. FPGA的IP软核、硬核以及固核
  2. Python读取PDF内容
  3. Linux下的at定时执行任务命令详解
  4. 【Network Security!】Banner信息收集
  5. 到底什么是P问题,NP问题,NPC问题,NP-hard问题?什么是规约(或约化)?
  6. JDK5.0新特性--可变参数
  7. cstring判断包含字符串_Python字符串方法之-解决判断问题
  8. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】
  9. 28. git 常用命令
  10. SharePoint Designer中无法显示任何列表
  11. excel甘特图模板_项目管理工具之甘特图使用流程
  12. OpenCV3编程入门(毛星云)读书笔记(一)
  13. Inverting the Generator of a GAN 生成器反向
  14. win10系统重装步骤详解
  15. 如何快速判断奇数和偶数
  16. 从零开始学JSON(修订版)
  17. 大疆M210 V2+妙算2-G+LIVOX MID-40使用记录
  18. CRMED知识付费2.0源码 已去授权
  19. 党政机关安全综合协同办公业务系统
  20. 【免费开放源码】审批类小程序项目实战(我的页面)

热门文章

  1. (王道408考研操作系统)第三章内存管理-第一节4:连续分配管理方式(单一连续、固定分区和动态分区分配)
  2. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)
  3. Linux系统编程11:进程入门之详细阐述进程的一些状态区分僵尸状态和孤儿状态动图演示
  4. httrack 拷贝网站到本地(好东西,但是发现考的不全)
  5. 1. OD-界面视图及基本快捷键操作,修改hello word
  6. Python subprocess.Popen 实时输出 stdout(正确管道写法)
  7. 非常详尽的 Shiro 架构解析
  8. Python中MRO
  9. 访问修饰符,封装,继承
  10. Composite UI Application Block学习笔记之Event Broker