额,这个真的有必要说么~~
链表是空间动态分配的,内存不连续,不能随机进行访问和储存的结构。
链表的存储方式注定了链表在查找时面临着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() 删除相邻重复元素