算法练习
算法练习
算法练习-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);
}
示例
总结
这题主要运用的就是链表的基本操作,查找和删除指定结点元素,难度不算大,懂得原理好,再利用画图很好写出来。