線性資料結構中,動態陣列、棧、佇列,底層都需要依託靜態陣列,靠resize來解決固定容量的問題。
鍊錶是真正的動態資料結構,並且是最簡單的動態資料結構。
鍊錶(linked list):資料儲存jii在」節點「(node)中
優點:真正的動態,不需要處理固定容量的問題。
缺點:喪失了隨機訪問的能力。
陣列最好用於索引有語意的情況,score[2],最大的優點:支援快速查詢
鍊錶不適合用於索引有語義的情況,最大的優點:動態
基本實現如下:
public class linkedlist
public node(e e)
public node()
@override
public string tostring()
}private node head;
private int size;
public linkedlist()
//獲取鍊錶元素個數
public int getsize()
//返回鍊錶是否為空
public boolean isempty()
}
如何在煉表頭新增元素?
當新增乙個新節點node,其值為666時,將node的next指向現在鍊錶的node,然後將head移動到新的node
//在煉表頭新增新的元素e
public void addfirst(e e)
如何在鍊錶中間新增元素?新增操作的第一步肯定是建立乙個新節點
關鍵就是找到待新增節點的前乙個節點,記為prev
具體實現:
//在鍊錶index(0-based)位置新增新的元素e
//並不是常見操作,一般面試、習題中會出現
public void add(int index, e e)
在鍊錶末尾新增元素?
public void addlast(e e)
思考:執行新增元素操作時,需要對頭節點單獨處理很不方便,可以引入虛擬頭節點dummyhead具體實現:
public class linkedlist
public node(e e)
public node()
@override
public string tostring()
}private node dummyhead;
private int size;
public linkedlist()
//獲取鍊錶元素個數
public int getsize()
//返回鍊錶是否為空
public boolean isempty()
//在鍊錶index(0-based)位置新增新的元素e
//並不是常見操作,一般面試、習題中會出現
public void add(int index, e e)
}public void addlast(e e)
//在煉表頭新增新的元素e
public void addfirst(e e)
}
查詢和修改
//獲取index位置元素
public e get(int index)
//獲取鍊錶最後的元素
public e getlast()
//修改index位置元素
public void set(int index, e e)
//查詢是否有元素e
public boolean contains(e e)
return false;
}
刪除元素
//從鍊錶中刪除index位置元素,並返回刪除的元素
public e remove(int index)
//從鍊錶中刪除第乙個元素,返回刪除元素
public e removefirst()
public e removelast()
玩轉資料結構之遞迴
遞迴本質上,將原來的問題,轉化成更小的同一問題 遞迴函式的呼叫,本質上就是函式的呼叫,只不過是函式在內部呼叫自己 寫遞迴的 一般兩個部分 1.遞迴的終止條件也叫最基本問題 2.遞迴演算法也叫原問題轉化為最基本問題的過程 舉例 陣列求和 sum a0 a1 an 1 求n個數的和 遞迴就是把原問題轉化...
玩轉資料結構《一》
集合是承載元素的容器 特點 每個元素只能存在一次 優點 去重 linkedlist bstadd o n o logn contains o n o logn remove o n o logn 有序集合 元素中具有順序性 多重集合 有序對映和無序對映 有序對映中鍵具有順序性的 無序對映中鍵沒有順序...
資料結構 表之煉表
頭插法建立 尾插法建立 顯示 銷毀 include include using namespace std typedef int elemtype typedef struct lnode linklist void createlinklistf linklist l,elemtype a,in...