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); } } }
|