額,這個真的有必要說麼~~
鏈表是空間動態分配的,內存不連續,不能隨機進行訪問和儲存的結構。
鏈表的存儲方式註定了鏈表在查找時面臨着O(n)的時間複雜度,雖然看起來不算很大,但是這是單次查找的複雜度,如果要進行稍微複雜一點的操作,複雜度便很可能會飆升到O(n^2),這個複雜度真的會死人的……
不過鏈表的優點也很明顯,如果程序對隨機存儲(也可以理解爲下標式操作)的效率要求不高,那麼使用鏈表存儲數據比用數組空間縮小了不少,而且插入、刪除之類的操作也方便很多(複雜度O(1),簡直不要太快)。因爲如果你要刪除一個元素,只需要修改元素左右兩個結點的指針,然後釋放空間就行了。
STL裏有List容器,而且是一個帶頭節點的環狀雙向鏈表。這種結構對於有大量插入或刪除操作的程序來說,效率提升很大。
同時注意,由於List不支持隨機訪問,所以STL的sort()函數不能對list使用,List容器自帶了sort()方法。
下面附上list成員函數說明:
constructor 構造函數
destructor 析構函數
operator= 賦值重載運算符
assign() 分配值
front() 返回第一個元素的引用
back() 返回最後一元素的引用
begin() 返回第一個元素的指針(iterator)
end() 返回最後一個元素的下一位置的指針
rbegin() 返回鏈表最後一元素的後向指針(reverse_iterator or const)
rend() 返回鏈表第一元素的下一位置的後向指針
push_back() 增加一元素到鏈表尾
push_front() 增加一元素到鏈表頭
pop_back() 刪除鏈表尾的一個元素
pop_front() 刪除鏈表頭的一元素
clear() 刪除所有元素
erase() 刪除一個元素或一個區域的元素(兩個重載)
remove() 刪除鏈表中匹配值的元素(匹配元素全部刪除)
remove_if() 刪除條件滿足的元素(遍歷一次鏈表),參數爲自定義的回調函數
empty() 判斷是否鏈表爲空
max_size() 返回鏈表最大可能長度
size() 返回鏈表中元素個數
resize() 重新定義鏈表長度(兩重載函數)
reverse() 反轉鏈表
sort() 對鏈表排序,默認升序
merge() 合併兩個有序鏈表並使之有序
splice() 對兩個鏈表進行結合(三個重載函數) 結合後第二個鏈表清空
insert() 在指定位置插入一個或多個元素(三個重載函數)
swap() 交換兩個鏈表(兩個重載)
unique() 刪除相鄰重複元素