第一周总结 | 数组、链表
【数组】
数组是存放在连续内存空间上的相同类型数据的集合;
数组下标都是从0开始的;
数组内存空间的地址是连续的;
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,难免要移动其元素的地址;
数组的元素是不能删的,只能覆盖;
常见的解题方法:
二分法 : 循环不变量,左闭右开,左闭右闭
双指针法(快慢指针):通过一个快指针和慢指针在一个
for
循环下完成两个for
循环的工作滑动窗口:主要理解滑动窗口如何移动窗口的起始位置,达到动态更新窗口的大小,从而得出长度最小的符合条件的长度。
精妙之处在于根据当前子序列的大小的情况,不断调节子序列的起始位置。从而降低时间复杂度
模拟行为:螺旋数组再一次介绍了循环不变量原则,
【链表】
种类:单链表,双链表,循环链表
存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。
增删改查的方式:
数组和链表在不同场景的性能分析
常见方法:
- 虚拟头结点:
- 链表的一大问题就是操作当前节点必须要找到前一个节点才能操作。每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题
- 链表的基本操作(常见的五个操作):
- 获取链表第index个节点的数组
- 在链表的最前面插入一个节点
- 在链表的最后面插入一个节点
- 在链表第index个节点前面插入一个节点
- 删除链表的第index个节点的数值
- 反转链表:迭代法;递归法;
- 删除倒数第N个节点:结合虚拟头结点和双指针法来移除
- 链表相交:使用双指针来找到两个链表的交点(引用完全相同,即:内存地址完全相同的交点)
- 环形链表:在链表中如何找环、如何找环的入口位置
- 虚拟头结点:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 林重笑!