一.概念
1.结点/节点概念:
单/双链表与顺序结构存在差异,每个节点都是独立申请下来的空间,于是每一个节点之间相互独立,就像火车的每一节车厢,无论增加或减少都对其他车厢没有影响.
节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。
有一个例子是这么说的,假设火车列车员手中只能拿一个钥匙,而每个车厢之间的门都处于上锁状态,那么列车员应该如何通过每一节车厢呢?
最简单的答案是:将当通往下一节车厢的钥匙留在该车厢.这也就是节点中保存下一个节点地址的原因---我们需要通过指针变量来从当前节点找到下⼀个节点.
你可能会问,按前面的例子来说,每一个车厢后跟着的不就是下一个车厢吗,保存地址这么做有什么意义呢?那么让我们继续往后看~
2.链表概念:
链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,一般分为单链表和双链表(双链表将在下一篇文章中进行详细分享)。
看到这个概念你是否能解答上一个问题了呢?
链表中的数据在保存时并非像火车车厢一样的顺序结构,随机存放正是它的特点,正因为如此,我们需要上一个节点来为我们指路,才能让我们在内存中找到下一个节点的位置.接下来让我们深入了解单链表吧.
1.单链表概念
单链表(无头单向非循环链表):结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结构的子结构.
单链表是一种数据结构,用于存储一系列的元素。它由一系列的节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。简单来讲,单链表类似于我们生活中的单程票,仅支持去往目的地,不支持返程.
2.特点
单链表的特点是只能在表头进行插入和删除操作,而不支持随机访问。
二.插入操作
当在单链表的表头插入一个新节点:
- 创建一个新的节点,并将新节点的数据元素设置为要插入的元素。
- 将新节点的指针指向原表头节点。
- 将新节点设为新的表头节点。
三.删除操作
当在单链表中删除一个节点:
- 找到要删除的节点的前一个节点。
- 将前一个节点的指针指向要删除节点的下一个节点。
- 删除要删除的节点。
操作总结引用如下:
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data; //节点数据
struct SListNode* next; //指针保存下⼀个节点的地址
}SLTNode;
void SLTPrint(SLTNode* phead);
//头部插⼊删除/尾部插⼊删除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);
//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置之前插⼊数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插⼊数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);
//销毁链表
void SListDesTroy(SLTNode** pphead);
四.优势
单链表的优点是插入和删除操作的时间复杂度低,为O(1),但是查找一个节点的时间复杂度为O(n),需要遍历整个链表。
单链表常用于需要频繁插入和删除节点的场景,例如实现队列、栈等数据结构.
今日分享到此结束,期待明天再见!