复习大纲
好吧,目前还没有。
计划每天刷leetcode题目,刷到相关知识点再进行归纳总结。
复习到的知识都记录下来!
编程书籍大全:https://github.com/EbookFoundation/free-programming-books/blob/main/books/free-programming-books-zh.md
刷题:https://leetcode.com/
算法
链表
leetcode题:https://leetcode.com/problems/add-two-numbers/submissions/1190457150/?source=submission-ac
两个单链表的数值相加问题,主要是对链表数据结构的运用。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
常见链表类型:单向链表、双向链表(多一个指向前驱节点的指针)、环形链表(尾节点指向头节点)
链表典型应用
单向列表:
-
栈与队列
当插入和删除操作都在链表的一端进行时,先进后出(栈)
当插入和删除操作在两端分别进行时,先进先出(队列) -
哈希表
链地址法是解决哈希冲突的主流方案之一,所有的冲突元素均放在一个链表中 -
图
邻接表是图的一种常用方式。
双向链表:常被用于需要快速查找前一个和下一个元素的场景
- 高级数据结构(红黑树、B树)
- 浏览器历史
- LRU算法
环形链表:常被用于需要周期性操作的场景,如操作系统的资源调度
- 时间片轮转调度算法(CPU调度)
- 数据缓冲区
链表QA
链表 VS 数组:
对比 | 数组 | 链表 |
---|---|---|
存储方式 | 连续内存空间 | 离散内存空间 |
容量扩展 | 长度不可变 | 可灵活扩展 |
内存占用 | 占用内存少 | 占用内存多,需存放指针 |
查找元素 | O(1) | O(n) |
增/删元素 | O(n) | O(1) |