[java]——深入理线性表与线性链表

前言

昨天遇到了一个问题,map如何保证散列均衡?如何扩展?自诩Java学的还算比较认真,但是没想到深度不够,并且借此机会,打算从新屡一边Java核心的东西,比如并发,JVM,IO。。。这样的话,最近的学习路线有四条了:jQuery,JAVA4Core(java核心内容,姑且这么起个名字),android高级(Open GL ES只学到理解和熟练阶段,等将来用到了再深入去研究)。废话不说,进入今天的正题——链表。

线性列表

是一种数据结构(我觉得java底层代码就是数据结构和设计模式的实现...),在物理内存里的存储是非连续的,非顺序的。这怎么理解呢?数组的存储模型是这样的,我们在声明数组的时候,需要指定数据类型,这样是为了给数组里每一个单元分配合适的内存,根据高高低低的原则,把数据线性的存在一块内存里。



这样做的好处是,可以快速查询,但是要实现插入数据和删除数据(因为其所占内存是连续的),譬如说在012345..的1、2位置之间插入一条数据,

结果是,包括2号数据在内的后边所有数据,都要往后移动一个单元,以保证连续性不变。同理,删除操作,也会导致数据的整体移动,保证连续性。

所以对于线性链表:

优点:查询速度快

缺点:插入和删除操作慢


为了解决插入和删除操作慢的问题,有一种新的数据结构:链表。

链表

链表分三种:单向链表,双向链表,循环链表。只要理解了单向链表,剩下两个也就不难了。

单向链表:

每个数据单元由两部分构成。第一部分为地址信息,用于指向下一块数据单元。第二部分为数据。下图中,右侧的单元结构很明显的可以分辨出是两部分。这样的结果,就是数据在内存块里,可以是不连续的。因为每一块数据单元都保存了下一块数据单元的地址,可以通过这个地址跳转过去(直接寻址)。

功能:内存分配更加灵活,插入和删除操作变得简单。因为:插入一条新数据,只需要更改前一个数据单元的指向地址即可,然后再把所插入的数据指向下一个数据单元。缺点:查询困难,需要从头开始查询。使用迭代器快速迭代。因为是非共享数据,线程不安全,当在迭代时,若发生了数据改变,快速迭代会迅速失败。


有了单向链表的思想,就可以构建双向链表。即:每个数据单元由三部分构成。

第一部分指向上一个数据单元,中间是数据,后面是指向下一个数据单元。相比单项链表,其复杂度低。双向链表可以从尾读到头,单项链表只能从头读到尾。第一条数据的第一个数据单元内存指向和最后一条数据尾部的内存指向均为null值。



由此有衍生出了双向循环链表,成为这一数据结构的最优解。第一个数据单元内存指向尾部,最后一条数据尾部的内存指向为head。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值