lc#xxx表示在LeetCode上有该问题,序号为xxx。
(长期更新中。。。)
编码题
- 单链表逆置(lc#206)
单链表反转01
struct ListNode {
int val;
ListNode* next;
}
ListNode * reverseList(ListNode * head)
{
ListNode* pre = NULL;
ListNode* curr = head;
while(curr != NULL)
{
ListNode* next = curr->next; //临时保存下一个元素的指针
curr->next = pre; //反向
pre = curr; //元素前移
curr = next;
}
return pre;
}
延伸:
- lc#92:指定特定元素反转。
- memcpy的实现
- 将输入字符串大写转换为小写,去掉空格。
选择题/问答题/修改题
- 二叉树前序遍历/中序遍历/后序遍历
根据代码更容易理解,示例代码如下:
//前序遍历
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c", T->data); //先打印数据,再遍历左、右子树
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf("%c", T->data); //中间打印数据
InOrderTraverse(T->rchild);
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data); //最后打印数据
}
两个二叉树遍历的性质:
1、已知前序遍历和中序遍历,可以唯一的确定一个二叉树;
2、已知后序遍历和中序遍历,可以唯一的确定一个二叉树;
但是,已知前序遍历和后序遍历,是不能唯一的确定一棵二叉树的。比如,前序遍历ABC,后续遍历CBA,我们可以确定A是根节点,但是无法确定那个是左子树,哪个是右子树。
参考链接:
二叉树的四种遍历方法笔记
图解二叉树几二叉树的遍历
排序算法对比
动态链接库和静态链接库
线程和进程的区别
virtual函数是如何实现的?
sizeof struct对齐
迭代器被修改的情况如何处理?
map必须要使用make_pair吗?能否直接用_map[0]这种形式。
const char* func()能用来创建string类型变量吗。