1:链表
对比数组,插入删除等操作代价为O(1),随机存取的代价为O(n)。常见链表有单链表,双向链表,循环链表等。
常见链表操作、有:创建,插入,删除,遍历,逆转,排序等等
1.1单链表
- 定义:
struct ListNode{
int val;
ListNode* next;
ListNode(int n=0):val(n),next(NULL){}
};
1.2双向链表
- 定义:
struct ListNode{
int val;
ListNode* next;
ListNode* pre;
ListNode(int n=0):val(n),next(NULL),pre(NULL){}
};
2:STL中的链表
链表可以轻松进行插入删除等操作而不影响迭代器,对比vector来说完全不同。vector由于插入和删除会引起内存重分配导致迭代器失效。
2.1 list
该链表为环形双向链表。只需要一个指针,指向置于尾端的一个空白节点,保持前闭后开的特点
2.1.1 操作
备注:下面所有注释代码为伪代码。只是为了读者大致明白意思
* begin
return (link_type)(node->next);
* end
return node;
* empty
return node==node->next;
* size
* front
* back
- push_back
void push_back(const T &x){
insert(end(),x);
}
push_front
等于insert(begin(),x);erase
不做详细书写,参考链表删除操作(把当前元素删除,将前置节点和后置节点连起来,返回后置节点)pop_front
等于erase(begin())- pop_back
void pop_end(){
iterator tmp = end();
erase(--tmp);
}
clear
清除所有节点并进行销毁remove
eg: remove(5). 遍历链表,移除所有元素值为5的节点unique
对连续且相同的元素,删除到只剩1个。eg: [1,2,2,1,4,4,4,5]进行unique操作后变成[1,2,1,4,5]transfer
内部操作,transfer(iterator pos,iterator first,iteratror last) 将[first,last)的元素移动到pos之前。splice
//将新链表x拼接到旧链表pos之前
void splice(iterator pos,list &x); x不同于*this
//将迭代器i所指元素插入到pos之前。x和*this可以为同一链表或者非同一链表
void splice(iterator pos,list &x,iterator i)
//将[first,last)的元素移动到pos之前,注意pos不能在[first,last)之间
void splice(iterator pos,iterator fisrt,iterator last)
- merge
//将链表x和当前链表进行合并,前提是两个链表进行了递增操作
void merge(list &x);
rerverse
链表反转sort
STL 自带sort只能用随机存取迭代器,list内置sort操作,该函数采用快排。
2.2 slist
slist不属于标准stl,不做特别介绍。slist为单向链表,迭代器只能++不能–,进行push和pop操作也只能进行push_front,pop_front操作,对插入特别提供insert_after操作。
3:经典算法题
常见基本操作:插入、删除、逆转
快速找到链表中心点
参考回文链表里思路回文链表
https://blog.csdn.net/wolf_break/article/details/81288291约瑟夫环
循环链表的应用