LinkedList的模拟实现(双向链表Java)
一:结构
LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。
1:LinkedList实现了List接口
2:LinkedList的底层使用了双向链表
3: LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
4: LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
5: LinkedList比较适合任意位置插入的场景
二:实现
2.1:addFirst(头插)
首先生成node对象,此时head节点的prev前一个节点为null,node的下一个节点为null,所以将此时head节点的prev指向node节点,将node节点的next节点指向head节点,再将head节点向前移,指向node,此时node节点就是头节点了。
2.2:addlast(尾插)
在链表最后插入node对象,此时last的next节点为null,在尾部插入了一个node,所以last.next=node,然后将node节点的prev节点指向last,在将last后置last=node,此时node节点就是最后一个节点。
2.3:addIndex(插入)
与单向链表不同,此时findIndex方法的返回值不需要返回要插入位置的前一个节点,而是直接返回要插入位置的节点。然后通过prev与next进行变换即可。
2.4: remove(删除指定节点)
2,5:removeAllKey(删除所有key)
与单一删除相同,只不过remove删除一个后最后就return,只要不返回然cur继续遍历重复执行上述代码,直到cur==null,全部删除完毕。