【數據結構】—— 3、鏈表和遞歸

一、什麼是鏈表(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)
      
  • 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;
        }
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章