# 数据结构 ## 架构梳理 - 线性(1:1) - 线性表 - 顺序存储 --> arr - 链式存储 --> 指针 (有头,无头) 有头是指有一个不存数据的头,始终作为这个链表的起点。 会更加简单,无头的话,更改首部节点会麻烦。 头节点不仅可以作为起点,还可以作为存储信息的仓库,因为头节点只有*next是必须的。 - 单链表 - 循环 - 不循环 - 双向链表 `lib`四个版本,第一个最基础完善,第二个改成了变长结构体,第三个在第二个的基础上封装了函数指针,第四个在第二个的基础上隐藏了数据结构,只暴露接口。 - 循环 - 不循环 学到这里可以去读一下内核有关**list**的实现,主要都是宏和内联函数。 - 栈 - 队列 - 树状(1:N) **递归**。**递归**转**非递归**。 - 图(N:M)