1.链表
1.链表反转 可以使用3个指针,逐步遍历然后反转链表;可以使用栈,后入先出重新组织链表
2.链表是否有环 可以使用map、hash等key唯一的方便查找的数据结构,遍历链表,发现重复节点即为有环;可以使用快慢指针,如果有环快指针一定会赶上慢指针
3.有环链表的入口 可以使用Map、hash方法,查到重复节点就是环的入口交点;可以使用快慢指针,保证快指针每次移动2步,慢指针移动1步,当快慢指针相等时候,让快指针=头节点从头开始走,每次走1步,慢指针每次也走1步。最后相遇时候就是入口,可以数学证明。
2.树
1.二叉树先序遍历可以使用递归,也可以使用栈来实现
void preorder(node *T) {
if (T) {
visit(T);
preorder(T->Lchild);
preorder(T->Rchild);
}
}
2.迷宫算法可以使用广度优先搜索,可以得到最优解。首先入口点入队列标记为灰色,然后入口点所有能到达的点入队列标记为灰色,入口点标记为黑色,对列向后移动,将队列的首个点的所有能到到的点入队列,并将首个点标记为黑色,如此循环直到找到出口点。队列中节点中加上父节点号,从而知道整条通路。
广度优先搜索使用队列,深度优先搜索使用栈,因为有回溯。
3.huffman编码,是讲所有节点当成一个只有一个根节点的树,然后取这森林里最小的两颗树组成一课新树放在森林里,重复直到剩余一棵树。
3.字符串
1.求子串匹配的位置
https://blog.csdn.net/gao506440410/article/details/81812163