原文:http://www.cnblogs.com/skywang12345/p/3561803.html

线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列。本章先介绍线性表的几个基本组成部分:数组、单向链表、双向链表。

数组

数组有上界和下界,数组的元素在上下界内是连续的。

存储10,20,30,40,50的数组的示意图如下:

数组的特点是:数据是连续的;随机访问速度快。
数组中稍微复杂一点的是多维数组和动态数组。对于C语言而言,多维数组本质上也是通过一维数组实现的。至于动态数组,是指数组的容量能动态增长的数组;对于C语言而言,若要提供动态数组,需要手动实现;而对于C++而言,STL提供了Vector;对于Java而言,Collection集合中提供了ArrayList和Vector。

 

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。

单链表的示意图如下:

表头为空,表头的后继节点是"节点10"(数据为10的节点),"节点10"的后继节点是"节点20"(数据为10的节点),...

单链表删除节点

删除"节点30"
删除之前:"节点20" 的后继节点为"节点30",而"节点30" 的后继节点为"节点40"。
删除之后:"节点20" 的后继节点为"节点40"。

单链表添加节点

在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10" 的后继节点为"节点20"。
添加之后:"节点10" 的后继节点为"节点15",而"节点15" 的后继节点为"节点20"。

单链表的特点是:节点的链接方向是单向的;相对于数组来说,单链表的的随机访问速度较慢,但是单链表删除/添加数据的效率很高。

双向链表

双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

双链表的示意图如下:

表头为空,表头的后继节点为"节点10"(数据为10的节点);"节点10"的后继节点是"节点20"(数据为10的节点),"节点20"的前继节点是"节点10";"节点20"的后继节点是"节点30","节点30"的前继节点是"节点20";...;末尾节点的后继节点是表头。

双链表删除节点

删除"节点30"
删除之前:"节点20"的后继节点为"节点30","节点30" 的前继节点为"节点20"。"节点30"的后继节点为"节点40","节点40" 的前继节点为"节点30"。
删除之后:"节点20"的后继节点为"节点40","节点40" 的前继节点为"节点20"。

双链表添加节点

在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10"的后继节点为"节点20","节点20" 的前继节点为"节点10"。
添加之后:"节点10"的后继节点为"节点15","节点15" 的前继节点为"节点10"。"节点15"的后继节点为"节点20","节点20" 的前继节点为"节点15"。

.net 实现双链表代码

    public class DoubleLink<T>{// 表头private DNode<T> mHead;// 节点个数private int mCount;// 双向链表“节点”对应的结构体private class DNode<T>{public DNode<T> prev;public DNode<T> next;public T value;public DNode(T value, DNode<T> prev, DNode<T> next){this.value = value;this.prev = prev;this.next = next;}}// 构造函数public DoubleLink(){// 创建“表头”。注意:表头没有存储数据!mHead = new DNode<T>(default(T), null, null);mHead.prev = mHead.next = mHead;// 初始化“节点个数”为0mCount = 0;}// 返回节点数目public int size(){return mCount;}// 返回链表是否为空public bool isEmpty(){return mCount == 0;}// 获取第index位置的节点private DNode<T> getNode(int index){if (index < 0 || index >= mCount)throw new ArgumentOutOfRangeException();// 正向查找if (index <= mCount / 2){DNode<T> node = mHead.next;for (int i = 0; i < index; i++)node = node.next;return node;}// 反向查找DNode<T> rnode = mHead.prev;int rindex = mCount - index - 1;for (int j = 0; j < rindex; j++)rnode = rnode.prev;return rnode;}// 获取第index位置的节点的值public T get(int index){return getNode(index).value;}// 获取第1个节点的值public T getFirst(){return getNode(0).value;}// 获取最后一个节点的值public T getLast(){return getNode(mCount - 1).value;}// 将节点插入到第index位置之前public void insert(int index, T t){if (index == 0){DNode<T> node = new DNode<T>(t, mHead, mHead.next);mHead.next.prev = node;mHead.next = node;mCount++;return;}DNode<T> inode = getNode(index);DNode<T> tnode = new DNode<T>(t, inode.prev, inode);inode.prev.next = tnode;inode.next = tnode;mCount++;return;}// 将节点插入第一个节点处。public void insertFirst(T t){insert(0, t);}// 将节点追加到链表的末尾public void appendLast(T t){DNode<T> node = new DNode<T>(t, mHead.prev, mHead);mHead.prev.next = node;mHead.prev = node;mCount++;}// 删除index位置的节点public void del(int index){DNode<T> inode = getNode(index);inode.prev.next = inode.next;inode.next.prev = inode.prev;inode = null;mCount--;}// 删除第一个节点public void deleteFirst(){del(0);}// 删除最后一个节点public void deleteLast(){del(mCount - 1);}}

运行结果

----int_test----
isEmpty()=false
size()=3
dlink(0)=30
dlink(1)=20
dlink(2)=10----string_test----
isEmpty()=false
size()=3
dlink(0)=thirty
dlink(1)=twenty
dlink(2)=ten----object_test----
isEmpty()=false
size()=3
dlink(0)=[30, vic]
dlink(1)=[20, jody]
dlink(2)=[10, sky]

转载于:https://www.cnblogs.com/luanxm/p/10388831.html

数据结构——数组、单向链表、双向链表相关推荐

  1. 数据结构 (二) ----- 单向链表双向链表

    相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...

  2. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  3. Java版数据结构之单向链表

    Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...

  4. Day 62 数据结构(单向链表,单向循环链表,双向链表)

    1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...

  5. 数据结构——单向链表-双向链表

    1.单向链表按位置修改 //按位置修改 int updata_pos(linklist *L,int pos,datatype new_e) {if(NULL==L||empty(L)||pos< ...

  6. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  7. java 单向链表 双向链表_java 单向链表与双向链表的实现

    链表 单向链表 单向链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 这是一种物理结构,不是树那样的逻辑结构.链表和顺序表两种物理结构, ...

  8. Java数据结构——数组、链表

    目录 数据的存储物理结构和逻辑结构 数组 数组的定义与初始化 特点 链表 链表相关代码技巧 数组与链表对比 数据的存储物理结构和逻辑结构 按物理结构: ①:连续的存储空间:数组 元素相邻,在内存中开辟 ...

  9. 数据结构——求单向链表的倒数第K个节点

    首先,对于链表来说,我们不能像数组一样直接访问,所以我们想到要求倒数第K个节点首先要知道最后一个节点. 然后从最后一个节点往前数K个. 最后得到想要的值. 但是这是不对的,为什么呢?因为题目给出的是单 ...

  10. 算法与数据结构--数组和链表的区别

    最近由于在找工作,经历了一些校招面试后,感觉在数据结构和操作系统上面,还有很多的欠缺.所以今天要学习一下数据结构.还是从面试的那到题开始. 数组和链表的区别? C和C++语言中用数组处理一组数据类型相 ...

最新文章

  1. kubesphere部署elasticsearch7.13.4
  2. struct tm 和 time_t
  3. python语言入门w-Python完全小白入门指南
  4. 大学最后一个学期了,感觉没对头。。。
  5. Xshell选中的同时把内容复制到剪贴板(还可以设置设置文本分隔符)
  6. 阻塞IO模型-数据读写
  7. 使用ueditor实现多图片上传案例——截取字符串层Util(SubString_text)
  8. Step By Step 搭建 MySql MHA 集群
  9. python中的is_python中的is
  10. 中国近代史自考必备简答题(一)
  11. mysql 查询语法基础_入门MySQL——查询语法练习
  12. PyCharm中配置模板
  13. 几何平均数和调和平均数是什么?有什么作用?详细资料讨论他们的区别
  14. win10微软图标点击无反应_双击电脑桌面图标没反应,win10双击图标没反应
  15. JSP文件的打开方式
  16. 手机快速将语音转换成文字的方法!详细步骤教你使用,方便又高效
  17. 数据化运营需要的四个层次
  18. 智能手机功能设计实现
  19. 二进制、八进制、十进制、十六进制之间的互相转化
  20. 少儿搜索软件测试,有道少儿词典app评测:学习字词好帮手

热门文章

  1. 今天来总结一下CSS中有哪些定位
  2. fat32硬盘格式能在苹果系统里读写操作吗?
  3. 康熙通宝铜钱值多少钱?
  4. 亲情可以冷酷到什么地步?大家有亲身经历的吗?
  5. 矜情作态的拼音及解释
  6. 分享一个最新思考的创业项目
  7. 90后的你,有什么赚钱方式?
  8. 现在最简单的赚钱套路
  9. 未处理的超时和请求取消
  10. 处理器好点是否上网就快些?