一、什麼是鏈表(Linked List)
之前的動態數組、棧、隊列的底層依託靜態數組,靠resize解決固定容量問題
- 1、正的一種最簡單的動態數據結構
- 2、更深入的理解引用(或者指針)
- 3、更深入的理解遞歸
- 4、輔助組成其他數據結構
- 5、數據存儲在節點(Node)中
class Node { E e; Node next; }
- a、優點:真正的動態,不需要處理固定容量的問題
- b、缺點:喪失了隨機訪問的能力
二、在鏈表中添加元素
- 1、在鏈表頭部添加元素
// head表示頭部第一個元素,新元素node
Node node = new Node(e)
node.next = head
head = node
// 另外一種寫法
head = new Node(e, head)
-
2、在鏈表中間添加元素
- a、先找到prev
Node prev = head; for(int i = 0; i < index -1; i++) { prev = prev.next; }
- b、插入元素
// 插入第一種寫法 Node node = new Node(e); node.next = prev.next; prev.next = node; // 另外一種寫法 prev.next = new Node(e, prev.next)
- a、先找到prev
-
3、爲鏈表設立虛擬頭結點
三、鏈表的遍歷、查詢和修改
四、鏈表的刪除
五、遞歸
本質上,將原來的問題,轉換成更小的同一問題
數組求和
public class Sum{
public static int sum(int[] arr){
return sum(arr, 0);
}
// 計算arr[l...n)這個區間誒所有數字的和,0 -> arr.length - 1 數字的和
private static int sum(int [] arr, int l) { // l爲左邊界
if(l == arr.length)
return 0;
return arr[l] + sum(arr, l+1);
}
}
遞歸的微觀解讀
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null)
return null;
ListNode res = removeElements(head.next,val);
if(head.val == val)
return res;
else {
head.next = res;
return head;
}
}
}