[数据结构]动画详解单链表

💖💖💖欢迎来到我的博客,我是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;
	}
}

总结

💖💖💖更多内容持续更新中💖💖💖
请各位多多关注我哦!!
我们后会有期
呼噜呼噜玉桂狗

  • 45
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿梦Anmory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值