数据结构-链表
链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个或两个域是指向其他单元的指针。这里具有一个数据域和多个指针域的存储单元通常称为节点。
1.单向链表
单向链表只有一个指针域,在整个节点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的节点
单向链表中,每个节点的数据域都是通过一个Object类的对象引用来指向数据元素,与数组类似,单向链表中的节点也具有一个线性次序,即如果节点a1的next引用指向节点a2,则a1就是a2的直接前驱,a2是a1的直接后续。只能通过前驱节点找到后续节点,而无法从后续节点找到前驱节点。
特点:数据元素的存储对应的是不连续的存储空间,每个存储节点对应一个需要存储的数据元素。每个节点是有数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的链接关系反映出来。
逻辑上相邻的节点物理上不必相邻。
优点:1.插入、删除灵活。 2.有元素才会分配结点空间,不会有闲置的结点。
缺点:1.比顺序存储结构的存储密度小
2.查找结点时链式存储要比顺序存储慢
2.双向链表
要在单向链表中找到某个节点的前驱节点,必须从链表的头节点出发依次向后寻找,但是需要O(n)时间。为此可以扩展单向链表的节点结构,使得通过一个节点的引用,不但能够访问其后续节点,也访问前驱节点。扩展单向链表节点结构的方法是,在单链表节点结构中新增加一个域,该域用于指向节点的直接前驱节点。该链表称为双向链表。双向链表可以从两个方向遍历。
在使用双向链表实现链接表时,为使编程更加简洁,使用带两个哑元节点的双向链表来实现链接表。其中一个是头节点,另一个是尾节点,都不存放数据元素,头节点的pre为空,尾节点的next为空。
3.链表和数组的区别
3.1区别
1.数组静态分配内存,链表动态分配内存
2.数组在内存中是连续的,链表是不连续的
3.数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)
4.数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。
3.2 数组的优点和缺点
优点:1.随机访问性比较强,可以通过下标进行快速定位
2.查找速度快
缺点:1.插入和删除的效率低,需要移动其他元素。
2.会造成内存浪费,因为内存是连续的,所以在申请数组的时候必须规定其内存的大小,如果不合适,就会造成内存的浪费。
3.内存空间要求高,创建一个数组,必须要有足够的连续内存空间
4.数组的大小是固定的,在创建数组的时候已经规定好,不能动态拓展。