链式存储结构之LinkedList源码分析
链式存储结构是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
- 为了表示每个数据元素a(i)和其直接后继数据元素a(i+1)之间的逻辑关系,对数据元素a(i)来说,除了存储其本身的信息外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
- 我们把存储数据元素信息的域称为数据域,把存储直接后继位的域称为指针域。
- 指针域中存储的信息称做指针或链。这两部分信息组成数据元素a(i)的存储映像,称为结点。
- 链表中第一个结点的存储位置叫做头指针。
- 链表的最后一个结点指针为”空”(通常用NULL或
^符号表示)
1. 链式存储结构的优缺点
优:删除和插入效率高
缺:查询效率低
2. 链表的分类
- 单链表
n个结点链成一个链表,此链表的每个结点中只包含一个指针域
静态链表:静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能力的方法。
- 循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了一个环,这种首尾相接单单链表称为单循环链表,简称循环链表
- 双向循环链表
双向链表是在单向循环链表的每个结点中,再设置一个指向其前驱结点的指针域。
在Java中,我们常见具有代表性的链式存储结构有很多,这里我们以LinkedList为例,进行分析,看看它内部是如何实现链式存储结构的。
|
|
Iterator和ListIterator主要区别在以下方面:
- ListIterator只能用于List,Iterator是通用的
- Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法。
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。