最近在回想数据结构的时候发现很多东西都不会了,所以看了下资料,在这里做个总结:
Java中我们经常用到List集合,这是我们接触数据结构最多的一个。
我们常遇到的List实现有2种,一个是ArrayList和LinkedList,这2个类就分别是用数组和链表实现的。
这里着重介绍下LinkedList,链表分为单链表,单向循环链表,双链表,双向循环链表。
单链表:
每一个方块儿就代表链表中的一个节点,每个节点中存储了节点数据和下一个节点的地址。
单向循环链表:
每一个方块儿就代表链表中的一个节点,每个节点中存储了节点数据和下一个节点的地址,而最后一个节点还存储了第一个节点的位置。
双链表(双向链表):
每一个方块儿就代表链表中的一个节点,除了第一个节点外,其余每个节点除了存储节点数据指向下一个节点地址还指向了上一个节点地址。
双向循环链表:
它在双向链表的基础上,在第一个节点增加了指向最后一个节点(相当于第一个节点的上一个节点地址指向了最后一个节点),在最后一个节点增加指向第一个节点(相当于最后一个节点的下一个节点地址指向了链表第一个节点)而LinkedList就是基于双向循环链表实现的。
谈到这里我们就来说说LinkedList和ArrayList的效率:
栈(先进后出):
我们把栈可以比喻成一个桶,所以最先进来的就会到桶底,然后后面一个接一个,这样也同时使得我们在取得时候只能先取外面的就是最后进来的那个,所以栈的出去顺序是先进后出。
那我们在实现栈的时候怎么实现呢?
第一种:用ArrayList实现,因为他在处理自己的循环删除操作时候从后往前删速度也很快,因为它是由数组实现的,所以他生成的栈的大小就是固定的了,这样有个好处就是节约了空间,当我们知道了要用多大容量的栈时,用这种就比较合适了。
第二种:用链表实现,LinkedList是双向链表,所以实现也很简单。
队列(先进先出):
这里在实现队列的时候我们就要用LinkedList了,ArrayList如果按照先进先出的策略去循环删除操作将会降低太多效率,不可取。LinkedList呢因为双向链表特性无论从前往后还是从后往前都是一样的效率。