C++算法之代码随想录(链表)——基础知识
(1)什么是链表
链表是一种线性数据结构。常见的单链表由两部分组成,value(存储节点的值)和next(存储指向下一个节点地址的指针)。链表的头节点称为head。创建链表一般使用结构体(struct)。例如。
strcut Node{int value;Node* next;Node(int x):val(x),next(null) { } //构造函数}
(2)链表的分类
1.单链表——(最常用)上面介绍过了。
2.双向链表 ——每个节点中除了value和next外,还有个指针prev指向上一个节点。头节点的prev指向null。例如
strcut B_Node{B_Node* prev;int value;B_Node* next;B_Node(int x):val(x),next(null),prev(null) { } //构造函数}
3.循环链表——与双向链表非常相似,不同点是循环链表的头节点中的prev指针指向尾节点。尾节点的的next指针指向头结点。形成了一个环。
(3)链表的存储
链表的存储在内存中是不连续的,只能通过节点指针的方式进行访问。
(4)链表的定义
通过结构体(strcut)创建,一般也就是上边的两种形式。构造函数可写可不写。不写C++会自动创建一个。不过不会初始化成员变量。
(5)链表的操作
1.添加节点。链表的访问只能通过指针进行。想要添加节点,就要把上一个节点的指针指向要添加的节点,再把添加的节点的指针原来的下一个节点即可。
2.删除节点:同样通过节点指针实现。将要删除的节点的上一个节点的指针指向删除节点指针指向的下一个节点即可。同时释放删除节点的内存。
这个结合图解看比较容易理解。可以看代码随想录的图解。
(6)性能分析
插入和删除:O(1);直接尾部插入即可。
访问:O(n);只能线性访问。
适合场景:数据量不固定,频繁插入和删除,较少查询的。
可以与数组进行对比。(它俩刚好相反,自己想一想)
链表的基础知识就这么多,但它是一种很重要的数据结构。理解其特性才能更好的解决相关的算法题。