数据结构 - 遍历单链表,删除节点,单链表逆序_单链表,删除第6个位置的结点,输出遍历结果

// 1、思考下为什么这样能解决问题;2、思考下设计链表时为什么要设计头节点
void bianli2(struct node*pH)
{
	//pH->data				// 头节点数据,不是链表的常规数据,不要算进去了
	struct node *p = pH;		// 头指针后面是头节点

	printf("-----------开始遍历-----------\n");
	while (NULL != p->pNext)		// 是不是最后一个节点
	{
		p = p->pNext;				// 走到下一个节点,也就是循环增量
		printf("node data: %d.\n", p->data);
	}

	printf("-------------完了-------------\n");
}

3.删除节点

从链表pH中删除节点,待删除的节点的特征是数据区等于data

返回值:当找到并且成功删除了节点则返回0,当未找到节点时返回-1

分两种情况:删除的节点在单链表的最尾,删除的节点在单链表中间。

int delete_node(struct node*pH, int data)
{
	// 找到这个待删除的节点,通过遍历链表来查找
	struct node *p = pH;			// 用来指向当前节点
	struct node *pPrev = NULL;		// 用来指向当前节点的前一个节点

	while (NULL != p->pNext)		// 是不是最后一个节点
	{
		pPrev = p;					// 在p走向下一个节点前先将其保存
		p = p->pNext;				// 走到下一个节点,也就是循环增量
		// 判断这个节点是不是我们要找的那个节点
		if (p->data == data)
		{
			// 找到了节点,处理这个节点
			// 分为2种情况,一个是找到的是普通节点,另一个是找到的是尾节点
			// 删除节点的困难点在于:通过链表的遍历依次访问各个节点,找到这个节点
			// 后p指向了这个节点,但是要删除这个节点关键要操作前一个节点,但是这
			// 时候已经没有指针指向前一个节点了,所以没法操作。解决方案就是增加
			// 一个指针指向当前节点的前一个节点
			if (NULL == p->pNext)
			{
				// 尾节点
				pPrev->pNext = NULL;		// 原来尾节点的前一个节点变成新尾节点
				free(p);					// 释放原来的尾节点的内存
			}
			else
			{
				// 普通节点
				pPrev->pNext = p->pNext;	// 要删除的节点的前一个节点和它的后一个节点相连,这样就把要删除的节点给摘出来了
				free(p);
			}
			// 处理完成之后退出程序
			return 0;
		}
	}
	// 到这里还没找到,说明链表中没有我们想要的节点
	printf("没找到这个节点.\n");
	return -1;
}

4.链表逆序

void reverse_linkedlist(struct node *pH)
{
	struct node *p = pH->pNext;		// pH指向头节点,p指向第1个有效节点
	struct node *pBack;				// 保存当前节点的后一个节点地址
	
	// 当链表没有有效节点或者只有一个有效节点时,逆序不用做任何操作
	if ((NULL ==p) || (NULL == p->pNext))
		return;
	
	// 当链表有2个及2个以上节点时才需要真正进行逆序操作
	while (NULL != p->pNext)		// 是不是最后一个节点
	{
		// 原链表中第一个有效节点将是逆序后新链表的尾节点,尾节点的pNext指向NULL
		pBack = p->pNext;			// 保存p节点后面一个节点地址
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/020e1721b7daa359c44680c42216db0a.png)

![img](https://img-blog.csdnimg.cn/img_convert/aabd8cb4548ec555f251b6c829083801.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/73338a17334c12ecf76b386fd70ef0a7.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/5cfe5abe190665ffe28af8d35a7ccb9b.png)

![img](https://img-blog.csdnimg.cn/img_convert/7147e192eafd535e99e39439166633b2.png)

![img](https://img-blog.csdnimg.cn/img_convert/2a4406467dde627bf2a49501ef576d36.png)

![](https://img-blog.csdnimg.cn/img_convert/c4af07ccaed24ae19016f8185460ad0f.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值