Java数据结构整理------List
最近在准备面试题,就想顺便在这里复习一下。
List 一个线性表,在地址空间上非连续
对于插入新节点,直接插在表头即可,时间复杂度是O(1)
对于删除节点,如果一直节点的位置,只需要将前面节点的指针直接指向该删除节点的next,时间复杂度O(1)。
对于查找来说,链表的查找需要遍历链表所有节点,时间复杂度O(n).
在Java中,我们在创建一个链表的时候,常用的有ArrayList,LinkedList这两种选择;
语法:
List<Integer> list = new ArrayList<>();
List<Integer> list = new LinkedList<>();
ArrayList
ArrayList,相当于C++中的vector,长度非固定,但是只能存储对象,不能存储原始数据类型例如int、char.
虽然相当于vector,但是ArrayList不能通过下标访问!!!!!
operation | method |
---|---|
添加 | add(Object) |
访问 | get(int index) |
更新 | set(int index, Object newValue) |
长度 | length() |
删除 | remove(int index)|| remove (Object) |
排序 | java.util.Collections.sort(arraylist) |
内部结构:
ArrayList内部其实是用数组来实现的,
其扩容方式为:
int newCapacity = oldCapacity + (oldCapacity >> 1);
是原来大小的(3/2)倍。
LinkedList
使用了循环双向链表数据结构,一个节点的实现如下:
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next){
this.item = element;
this.next = next;
this.prev = prev;
}
}
所以,在一开始创建LinkedList的时候,其实是创建了一个空的头指针。
operation | method |
---|---|
添加 | add(Object)//end of the list | addFirst(Object)| addLast(Object) |
访问 | get(int index) | getFirst() | getLast() |
更新 | set(int index, Object newValue) |
长度 | size() |
删除 | remove(int index)| remove (Object) | removeFirst() | removeLast() |
排序 | java.util.Collections.sort(linkedlist) |