线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构(内存上)上并不一定是连续的,线性表在物理上存储时,通常以数组(在物理上是连续的)和链式结构(在物理上不连续)的形式存储。
顺序表顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。(可以说顺序表就相当于一个数组)
那么问题来了,为什么不直接使用数组,而要把数组放在类当中,然后再对数组进行操作? 因为数组没有面向对象,把数组放进类当中,可通过对象对它进行操作。
听着概念有点模糊,接下来通过模拟顺序表的接口实现来认识一下顺序表:
????用Arraylist来模拟实现顺序表ArrayList的接口实现:
Arraylist:
在pos位置新增元素:
判断是否包含某个元素:
查找pos位置:
在pos位置上给值value
删除第一次出现的关键字key
链表链表是一种 物理存储结构(内存)上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 实际中链表的结构非常多样,以下情况组合起来就有 8 种链表结构:
单向、双向
带头、不带头
循环、非循环
接下来主要讲两种:单向不带头非循环、双向不带头非循环
????链表接口的模拟实现( 单向不带头非循环): 链表是由一个一个节点组成,单向不带头非循环链表每个节点有两个域,一个是数据域,用来存放数据,另一个是存放下一个节点的地址。
创建节点:
以上说的链表是指单向不带头非循环链表!!!
初始化链表:
打印链表:
头插法:
尾插法:
任意位置插入一个数据:
删除关键字key所在节点位置:
删除所有值为key的节点:
双向不带头非循环:
这种链表至少有三个域组成,一个是数据域,一个是存放上一个节点的位置,一个存放下一个节点的位置,双向比单向的好处就体现出来了,双向链表只要知道当前节点位置,就可以对链表进行增删查改,而单相链表还需要知道当前节点的上一个节点。
接口模拟实现:
查找是否包含关键字在链表中:
删除第一次出现的关键字:
删除所有值为key的节点:
头插法:
尾插法:
任意位置插入,第一个数据节点下标为0:
小结在这里,我们讲了顺序表也讲了链表,那么他们有什么区别呢?
在组织上:
1、顺序表底层是一个数组,他是一个逻辑上和物理上都是连续的
2、链表是一个由若干节点组成的一个数据结构,逻辑上是连续的但是在物理上[内存上]是不连续的。
在操作上:
1、顺序表适合,查找相关的操作,因为,可以使用下标,直接获取到某个位置的元素。
2、链表适合于,频繁的插入和删除操作。此时不需要像顺序表一样,移动元素。链表的插入只需要修改指向即可。
3、顺序表还有不好的地方,就是你需要看满不满,满了要扩容,扩容了之后,不一定都能放完。所以,他的空间上的利用率不高。
以上就是我对顺序表和链表的一些理解,如果有什么不对的地方,欢迎各位提出来!
到此这篇关于Java全面讲解顺序表与链表的使用 的文章就介绍到这了,更多相关Java顺序表与链表内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!