常见的数据结构链表、队列、栈、二叉树、堆
使用内置结构实现高级数据结构,比如内置的list/deque实现栈
链表有单链表、双链表、循环双端链表
如何使用python来表示链表结构
实现链表常见操作,比如插入节点,反转链表,合并多个链表
leetcode练习常见链表题目
队列是先进先出结构
实现队列的append和pop操作,如何做到先进先出
使用python的list或者collections.deque实现队列
栈是后进先出结构
实现栈的push和pop操作,如何做到后进先出
使用python的list或者collections.deque实现队列
如何使用两个栈实现一个队列
如何获取最小值的栈MinStack
python dict/set底层都是哈希表
哈希表的实现原理,底层是一个数组
根据哈希函数快速定位一个元素,平均查找O(1),非常快
不断加入元素会引起哈希表重新开辟空间,拷贝之前元素到新数组
哈希表如何解决冲突
链接法和开放寻址法
元素key冲突之后使用一个链表填充相同key的元素
开放寻址法是冲突之后根据一种方式(二次探查)寻找下一个可用的槽
cpython使用的二次探查
二叉树数据结构
先序,中序,后序遍历
先(根)序:先处理根,之后是左子树,然后是右子树
中(根)序:先处理左子树,然后是根,然后是右子树
后(根)序:先处理左子树,然后是右子树,最后是根
树的遍历方式
先序遍历,其实很简单,递归代码里先处理根就好
中序遍历,调整下把print(subtree.data)放中间就好
常考数据结构之堆
堆其实就是完全二叉树,有最大堆和最小堆
最大堆:对于每个非叶子节点V,V的值都比它的两个孩子大
最大堆支持每次pop操作获取最大的元素,最小堆获取最小元素
常见问题:用堆来完成topk问题,从海量数字中寻找最大的k个
使用堆解决TOPK问题
常考数据结构链表
链表涉及到指针操作较为复杂
熟悉链表的定义和常见操作
常考题:删除一个链表节点
常考题:合并两个有序链表
数据结构常考题二叉树
二叉树涉及到递归和指针操作,常结合递归考察
二叉树的操作很多可以用递归的方式解决,不了解递归会比较吃力
常考题:二叉树的镜像
常考题:如何层序遍历二叉树(广度优先)
常考题栈与队列
熟练掌握用python的list或者collections.deque()实现栈和队列
常考题:用栈实现队列
leetcode implement-queue-using-stacks
常考题堆
理解堆的概念,堆是完全二叉树,有最大堆和最小堆
会使用python内置的heapq模块实现堆的操作
常考题:合并k个有序链表 leetcode merge-k-sorted-list
合并两个有序链表
1.读取所有链表值
2.构造一个最小堆heapq很容易实现
3.根据最小堆构造一个链表
python字符串常考
python内置了很多字符串操作,比如split,upper,replace等
常考题:翻转一个字符串
常考题:判断一个数字是否是回文数
算法与数据结构练习题
1.反转链表
如何反转一个单链表
能使用循环的方式实现吗?
能否用递归的方式实现?