算法练习-day16删除链表中指定的元素

算法练习

算法练习
算法练习-day01 判断质数和找出计算完全数
算法练习-day02 统计字符串中字符种类的个数和求两数的最小公倍数
算法练习-day03 小球下落走过的距离和自动判定程序
算法练习-day04 统计字符串中某字符出现的次数
算法练习-day05 反转输出链表
算法练习-day06 字符串法转
算法练习-day07 统计每个月兔子的总数
算法练习-day09 5个数求最值和ASCLL码排序
算法练习-day10 奇偶数分离
算法练习-day11 鸡兔同笼
算法练习-day12 字符串替换
算法练习-day13打印学生成绩和求s=1!+2!+…+10!
算法练习day14-删除排序链表中的重复元素和反转链表
算法练习 day15合并两个有序链表

题目:删除链表中指定的元素

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点数据范围:0<=链表节点值<=100000<=链表长度<=10000

  • 输入
    {2,5,1,9},5
  • 输出
    {2,1,9}
  • 说明
  • 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
  • 输入
    {2,5,1,9},1
  • 输出
    {2,5,9}
  • 说明

给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9

思路

首先遍历链表找到要删除元素的节点,然后将其后继结点的值赋给其自身,然后删除后继节点。

在这里插入图片描述

算法实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <corecrt_malloc.h>
#include <stdio.h>
typedef int Elemtype;
typedef struct Lnode {//定义单链表类型
	Elemtype data;
	struct Lnode* next;

} Lnode,*LinkList;
//尾插法创建链表
LinkList List_tailinsert(LinkList& L)
{
	Elemtype x;//需要存入到链表中的数据
	L = (Lnode*)calloc(1, sizeof(Lnode));
	Lnode* s, * r=L;//r指向表尾
	scanf("%d", &x);
	while (x != -1)
	{
		s = (Lnode*)calloc(1, sizeof(Lnode));
		s->data = x;
		r ->next = s;
		r = s;//始终指向尾结点
		scanf("%d", &x);
	}
	r->next = NULL;//表尾置空
	return L;
}
//删除指定指定节点元素
LinkList DelElem(LinkList &L, Elemtype p)
{
	
	Lnode* q = L ->next;
	//从第一个结点开始查找数据域为p的结点
	while (q != NULL && q->data != p)
	{
		q = q->next;
	}
	Lnode* t = q->next;//是一个中间变量,t令t指向q的后继结点
	q->data = q->next->data;//让q的后继结点的数据赋给q
	q->next = t->next;//让t从链中“断开”
	return L;
}
// 打印函数
void PrintList(LinkList L)
{
	L = L->next;
	while (L != NULL)
	{
		printf("%3d", L->data);//打印当前结点数据
		L = L->next;//指向下一个结点
	}
	printf("\n");
}
int main()
{
	LinkList L;
	
	List_tailinsert(L);//创建链表数据
	printf("输入您要删除的数据:");
	int data;
	scanf("%d",&data);//data为你要删除的数据
	DelElem(L,data);
	PrintList(L);

}

示例

在这里插入图片描述

总结

这题主要运用的就是链表的基本操作,查找和删除指定结点元素,难度不算大,懂得原理好,再利用画图很好写出来。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值