💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到动画详解数据结构系列
用通俗易懂的动画的动画使数据结构可视化
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识
今天我们来了解一个全新的数据结构,链表
话不多说,直接开始
文章目录
- 链表概念
- 链表的定义
- 单链表
- 尾插
- 动画详解尾插
- 头插
- 动画详解头插
- 在指定位置之前插入
- 动画详解在指定位置之前插入元素
- 在指定位置之后插入
- 动画详解在指定位置之后插入
- 删除指定位置之前的元素
- 动画详解删除指定位置之前元素
- 删除指定位置之后的元素
- 动画详解删除指定位置之后的元素
- 链表的销毁
- 总结
链表概念
什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
链表的入口节点称为链表的头结点也就是head。
——来自代码随想录
链表的定义
// 定义一个链表结构体
struct ListNode
{
DataType val; // 链表存储的数据
struct ListNode* next;// 指向下一个节点的指针
};
单链表
由于不带哨兵位,也就是虚拟头节点,我们需要对链表的头节点进行单独判断
尾插
// 开辟新节点
LN* BuyNode(DataType x)
{
LN* new = (LN*)malloc(sizeof(LN));
if (new == NULL)
{
perror("malloc failed");
return;
}
new->val = x;
new->next = NULL;
return new;
}
// 链表尾插
void LNPushBack(LN** pplist, DataType x)
{
assert(pplist);
LN* new = BuyNode(x);
if (*pplist == NULL)
{
*pplist = new;
}
else
{
// 找尾
LN* ptail = *pplist;
while (ptail->next)
{
ptail = ptail->next;
}
ptail->next = new;
}
}
动画详解尾插
头插
// 链表头插
void LNPushFront(LN** pplist, DataType x)
{
assert(pplist);
LN* new = BuyNode(x);
if (*pplist == NULL)
{
*pplist = new;
}
else
{
LN* pfront = new;
pfront->next = *pplist;
// 让pfront成为新的头节点,也就是更新pplist的位置,使其成为新的头节点
*pplist = pfront;
}
}
动画详解头插
在指定位置之前插入
// 在指定位置之前插入数据
void LNInsert(LN** pplist, LN* pos, DataType x)
{
assert(*pplist && pos);
LN* new = BuyNode(x);
LN* prev = *pplist;
while (prev->next != pos)
{
prev = prev->next;
}
new->next = pos;
prev->next = new;
}
动画详解在指定位置之前插入元素
在指定位置之后插入
// 在指定位置之后插入数据
void LNInsertAfter(LN* pos, DataType x)
{
assert(pos);
LN* new = BuyNode(x);
new->next = pos->next;
pos->next = new;
}
动画详解在指定位置之后插入
删除指定位置之前的元素
// 删除指定位置数据
void LNDelPos(LN** pplist, LN* pos)
{
assert(pplist && *pplist);
assert(pos);
// 如果pos是头节点
if (pos == *pplist)
{
*pplist = pos->next;
free(pos);
pos = NULL;
}
// pos不是头节点
LN* prev = *pplist;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
pos = NULL;
}
动画详解删除指定位置之前元素
删除指定位置之后的元素
// 删除指定位置之后的数据
void LNDelAfter(LN* pos)
{
assert(pos);
LN* pcur = pos->next;
pos->next = pos->next->next;
free(pcur);
pcur = NULL;
}
动画详解删除指定位置之后的元素
链表的销毁
// 销毁链表
void LNDestroy(LN** pplist)
{
LN* cur = *pplist;
while (cur)
{
LN* next = cur->next;
free(cur);
cur = next;
}
}
总结
💖💖💖更多内容持续更新中💖💖💖
请各位多多关注我哦!!
我们后会有期