链表应用
虽然考试中极少会考察链表的实际应用,一般都是直接考各种链表的各种操作,不过我觉得了解链表的实际应用场景有利于建立一种直觉,加深我们对链表数据结构本身的理解。由于我本身对链表应用也不甚了解,在查阅一定资料后,我认为有一句话能比较好的总结:
链表插入删除效率极高,达到O(1)。对于不需要搜索但变动频繁且无法预知数量上限的数据,比如内存池、操作系统的进程管理、网络通信协议栈的trunk管理等等等等,缺了它是绝对玩不转的。[1]——知乎用户invalid s
链表
这一小节主要讨论链表本身:单链表的抽象数据类型(ADT)、有哪些种类的链表、关于链表的常考题型有哪些
抽象数据类型
class MyLinkedList{
public:
// 单链表结点
struct ListNode{
int val;
struct ListNode* next;
}
// 构造函数
MyLinkedList(){}
// 获取第index位的元素
int get(int index){}
// 头插法插入元素
void addAtHead(int val){}
// 尾插法插入元素
void addAtTail(int val){}
// 在第index位插入元素
void addAtIndex(int index, int val){}
// 删除第index位的元素
void deleteAtIndex(int index){}
}
各类链表
- 带头结点的(头指针的后继指向第一个元素)
- 不带头结点的(头指针指向第一个元素)
- 单链表(每个元素只需要维护一个指针)
- 双链表(每个元素需要维护两个指针,分别指向前驱和后继结点)
- 循环的(最末尾元素的后继为空)
- 不循环的(最末尾元素的后继为第一个元素或头结点)
常考题型
题目挑选范围参考Github仓库CyC2018/CS-Notes[2]
对两个链表进行一系列操作
主要考察增删改查操作
对单链表内结点进行操作
也主要考察增删改查操作
循环链表(双指针技巧)
双指针技巧不仅可以很有效地判断链表是否有环,在一些问题,如寻找链表中点、判断链表是否相交等问题也能起到奇效
参考资料
[1] 链表(linked list)这一数据结构具体有哪些实际应用? - invalid s的回答 - 知乎 https://www.zhihu.com/question/60724366/answer/179474654