1. 数组 (Array) 特点 :连续内存,随机访问 O(1),插入/删除 O(n)。
常见操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 int [] arr = {1 , 2 , 3 , 4 , 5 };for (int i = 0 ; i < arr.length; i++) System.out.print(arr[i] + " " );public static int find (int [] arr, int target) { for (int i = 0 ; i < arr.length; i++) { if (arr[i] == target) return i; } return -1 ; } public static int [] insert(int [] arr, int pos, int val) { int [] newArr = new int [arr.length + 1 ]; for (int i = 0 , j = 0 ; i < newArr.length; i++) { if (i == pos) newArr[i] = val; else newArr[i] = arr[j++]; } return newArr; } public static int [] delete(int [] arr, int pos) { int [] newArr = new int [arr.length - 1 ]; for (int i = 0 , j = 0 ; i < arr.length; i++) { if (i == pos) continue ; newArr[j++] = arr[i]; } return newArr; } public static void reverse (int [] arr) { int i = 0 , j = arr.length - 1 ; while (i < j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }
2. 链表 (Linked List) 特点 :动态存储,插入/删除 O(1),随机访问 O(n)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 class ListNode { int val; ListNode next; ListNode(int val) { this .val = val; } } public static void traverse (ListNode head) { for (ListNode p = head; p != null ; p = p.next) System.out.print(p.val + " " ); } public static ListNode insertHead (ListNode head, int val) { ListNode node = new ListNode (val); node.next = head; return node; } public static void insertAfter (ListNode node, int val) { if (node == null ) return ; ListNode newNode = new ListNode (val); newNode.next = node.next; node.next = newNode; } public static ListNode delete (ListNode head, int target) { if (head == null ) return null ; if (head.val == target) return head.next; ListNode p = head; while (p.next != null ) { if (p.next.val == target) { p.next = p.next.next; break ; } p = p.next; } return head; } public static ListNode reverse (ListNode head) { ListNode prev = null , curr = head; while (curr != null ) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }
3. 栈 (Stack) 特点 :LIFO,常用数组或链表实现。
1 2 3 4 5 6 7 8 class MyStack { private LinkedList<Integer> list = new LinkedList <>(); public void push (int val) { list.addLast(val); } public int pop () { return list.removeLast(); } public int peek () { return list.getLast(); } public boolean isEmpty () { return list.isEmpty(); } }
4. 队列 (Queue) 特点 :FIFO,可以用链表或循环数组实现。
1 2 3 4 5 6 7 8 class MyQueue { private LinkedList<Integer> list = new LinkedList <>(); public void enqueue (int val) { list.addLast(val); } public int dequeue () { return list.removeFirst(); } public int peek () { return list.getFirst(); } public boolean isEmpty () { return list.isEmpty(); } }
双端队列 Deque
1 2 3 4 5 Deque<Integer> deque = new LinkedList <>(); deque.addFirst(1 ); deque.addLast(2 ); deque.removeFirst(); deque.removeLast();
5. 树 (Tree) 以 二叉树 为例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class TreeNode { int val; TreeNode left, right; TreeNode(int val) { this .val = val; } } public static void preorder (TreeNode root) { if (root == null ) return ; System.out.print(root.val + " " ); preorder(root.left); preorder(root.right); } public static void inorder (TreeNode root) { if (root == null ) return ; inorder(root.left); System.out.print(root.val + " " ); inorder(root.right); } public static void postorder (TreeNode root) { if (root == null ) return ; postorder(root.left); postorder(root.right); System.out.print(root.val + " " ); } public static void levelOrder (TreeNode root) { if (root == null ) return ; Queue<TreeNode> q = new LinkedList <>(); q.add(root); while (!q.isEmpty()) { TreeNode node = q.poll(); System.out.print(node.val + " " ); if (node.left != null ) q.add(node.left); if (node.right != null ) q.add(node.right); } }
6. 堆 (Heap) 常用 最小堆 / 最大堆 ,一般用数组实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import java.util.PriorityQueue;PriorityQueue<Integer> minHeap = new PriorityQueue <>(); minHeap.add(3 ); minHeap.add(1 ); minHeap.add(5 ); System.out.println(minHeap.poll()); PriorityQueue<Integer> maxHeap = new PriorityQueue <>((a, b) -> b - a); maxHeap.add(3 ); maxHeap.add(1 ); maxHeap.add(5 ); System.out.println(maxHeap.poll());
7. 图 (Graph) 常见表示:邻接表 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import java.util.*;class Graph { private Map<Integer, List<Integer>> adj = new HashMap <>(); public void addEdge (int u, int v) { adj.computeIfAbsent(u, k -> new ArrayList <>()).add(v); adj.computeIfAbsent(v, k -> new ArrayList <>()).add(u); } public void bfs (int start) { Set<Integer> visited = new HashSet <>(); Queue<Integer> q = new LinkedList <>(); q.add(start); visited.add(start); while (!q.isEmpty()) { int node = q.poll(); System.out.print(node + " " ); for (int nei : adj.getOrDefault(node, new ArrayList <>())) { if (!visited.contains(nei)) { visited.add(nei); q.add(nei); } } } } public void dfs (int start) { Set<Integer> visited = new HashSet <>(); dfsHelper(start, visited); } private void dfsHelper (int node, Set<Integer> visited) { if (visited.contains(node)) return ; visited.add(node); System.out.print(node + " " ); for (int nei : adj.getOrDefault(node, new ArrayList <>())) { dfsHelper(nei, visited); } } }