笔记:代码随想录
数组
概念
存放在连续内存空间上相同类型数据的集合(内存地址、字符数组、下标)。
特点
数组元素不能删除,只能覆盖(因为数组元素在内存中是连续的)
方法
1.二分法
条件:(1)有序数组;(2)数组中无重复元素。
思路:循环不变量。
2.双指针法
条件:数组、链表、字符串
3.滑动窗口
定义:不断调节子序列起始位置和终止位置,得到想要的结果。
4.模拟行为
链表
概念
通过指针串联在一起的线性结构,每一个节点由两部分组成,一个数据域一个指针域(存放指向下一个节点的指针),最后一个节点的指针指向null(空指针)。(内存地址、数据域、指针域)
链接的入口节点称为链表的头节点(head)。
特点
非连续分布


编辑
其他
单链表:只指下。
双链表:每一个节点有两个指针域,指上指下(可向前向后查询)。
循环链表:链表首尾相连(可以解决约瑟夫环问题。)
数组:数据量固定,频繁查询,较少增删。
链表:数据量不固定,较少查询,频繁增删。
单链表节点具备两个属性:val和next,val是当前节点的值,next是指向下一个节点的指针/引用。双向链表还需要一个属性prev以指示链表中的上一个节点。
删除某个节点时,C++里最好是再手动释放这个节点,释放这块内存。其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。


编辑
方法
1.移除链表元素
思路:使用头结点。
2.设计链表
定义
(1)get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
(2)addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
(3)addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
(4)addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
(5)deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
3.翻转链表
思路:迭代法,递归法
4.两两交换链表中的节点
5.删除链表倒数第N个节点
思路:双指针法
6.链表相交
7.环形链表
思路:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。