顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构。
Array是固定大小的顺序表,定义为:
int[] arr = new int[] {1,2,3,4,5};
ArrayList是可以动态扩容的顺序表。
单链表节点
public class ListNode {
int val; // 值
ListNode next; // 指向下一个节点
ListNode(int x) { val = x; }
}
双链表节点
public class ListNode {
int val; // 值
ListNode next; // 指向下一个节点
ListNode pre; // 指向上一个节点
ListNode(int x) { val = x; }
}
此类实现 Deque
接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
Queue
和Deque
接口都是队列的数据结构
Queue
是普通队列的接口Deque
是双端队列的接口ArrayDeque是Java集合框架中的一个双端队列(Deque
)实现类。它基于数组实现,可以在两端高效地插入和删除元素。
实现原理
front
和rear
)来标记队列的头部和尾部。当向队列中添加元素时,rear指针向后移动;当从队列中删除元素时,front指针向后移动。如果数组满了,ArrayDeque会自动扩容。LinkedList也是Java集合框架中的一个双端队列(Deque
)实现类。它基于链表实现,可以在任意位置高效地插入和删除元素。
实现原理
ArrayDeque可以当作栈来使用
LinkedList可以当作栈来使用
堆分为大根堆和小根堆:
PriorityQueue
和PriorityBlockingQueue
两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue。案例:
PriorityQueue队列默认是小顶堆,如果需要大顶堆需要用户提供比较器。
import java.util.PriorityQueue;
public class Test2 {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.offer(12);
priorityQueue.offer(3);
priorityQueue.offer(24);
System.out.println(priorityQueue.peek());
System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.peek());
}
}
输出结果:
如果需要大顶堆需要用户提供比较器。提供比较器的两种写法如下:
方法一: 定义一个类,使这个类实现Comparator接口
import java.util.Comparator;
import java.util.PriorityQueue;
class IntCmp implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}
public class Test2 {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new IntCmp());
priorityQueue.offer(12);
priorityQueue.offer(3);
priorityQueue.offer(24);
System.out.println(priorityQueue.peek());
System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.peek());
}
}
方法二: 重写比较器
import java.util.Comparator;
import java.util.PriorityQueue;
public class Test2 {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((a, b) -> {
return b - a;
});
priorityQueue.offer(12);
priorityQueue.offer(3);
priorityQueue.offer(24);
System.out.println(priorityQueue.peek());
System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.peek());
}
}
树又分为:二叉树、二叉搜索树、平衡二叉树、红黑树、B树等。
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {val = x;}
}
图有节点和边组成,实现的方式有:
Map<Integer, List<int[]>> graph = new HashMap();