首先看一下题
描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1
3 2表示为
2->3
链表为2->3->1
5 1表示为
1->5
链表为2->3->1->5
4 5表示为
5->4
链表为2->3->1->5->4
7 2表示为
2->7
链表为2->7->3->1->5->4
最后的链表的顺序为 2 7 3 1 5 4
最后一个参数为2,表示要删掉节点为2的值
删除 结点 2
则结果为 7 3 1 5 4
数据范围:链表长度满足 1≤n≤1000 ,节点中的值满足 0≤val≤10000
测试用例保证输入合法
输入描述:
输入一行,有以下4个部分:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值输出描述:
输出一行
输出删除结点后的序列,每个数后都要加空格
示例1
输入:
5 2 3 2 4 3 5 2 1 4 3输出:
2 5 4 1说明:
形成的链表为2->5->3->4->1 删掉节点3,返回的就是2->5->4->1示例2
输入:
6 2 1 2 3 2 5 1 4 5 7 2 2输出:
7 3 1 5 4说明:
如题
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.输入一个单向链表和一个节点的值
2.从单向链表中删除等于该值的节点
3.删除后如果链表中无节点则返回空指针。
4.链表的值不能重复。
5.构造过程,例如输入一行数据为:6 2 1 2 3 2 5 1 4 5 7 2 2
则表示第一个参数6表示输入总共6个节点,
第二个参数2表示头节点值为2
剩下的2个一组表示第2个节点值后面插入第1个节点值
为以下表示:
1 2 表示为
2->1
链表为2->1
3 2 表示为
2->3
链表为2->3->1
5 1表示为
1->5
链表为2->3->1->5
4 5表示为
5->4
链表为2->3->1->5->4
7 2表示为
2->7
链表为2->7->3->1->5->4
6.最后的链表的顺序为2 7 3 1 5 4
7.最后一个参数为2,表示要删掉节点为2的值
删除节点2 则结果为7 3 1 5 4
8.数据范围:链表长度满足n大于等于1小于等于1000,节点中的值满足val大于等于0小于等于10000
9.测试用例保证输入合法
10.输入描述:输入一行,有以下4个部分:
1 输入链表节点个数
2 输入头节点的值
3 按照格式插入各个节点
4 输入要删除的节点的值
11.输出描述:输出一行
输出删除节点后的序列,每个数后都要加空格
二、解题思路
1.首先#include <stdio.h>包含标准输入输出库的头文件,可以使用scanf和printf函数
2.#include <stdlib.h>引入标准库,以便使用动态内存分配函数malloc和free
3.我们定义链表,包含两个成员一个用来放节点值一个用来指向下一个节点
typedef struct linkedList {
int val;
struct linkedList *next;
} Node;
4.声明一个函数void insertNode,接受三个参数一个指向链表头节点的指针Node *head,一个整数int aim,一个整数int val,这个函数用于在链表中插入一个新节点
5.开始一个while循环条件是head != NULL(只要还没有遍历完链表){
6.如果当前节点值等于我们的目标节点值if(head->val == aix){
7.我们定义一个Node *temp = (Node*)malloc(sizeof(Node));
8.设置新节点的值为temp->val = val;
9.将新节点的next指针指向当前节点的下一个节点
temp->next = head->next;
10.将当前节点的下一个节点变成temp,完成插入操作
head->next = temp;
11.然后返回return;
}
12.如果当前节点的值不是我们要找的我们移动到下一个节点继续寻找
head = head->next;}
13.然后我们声明一个void delNode(Node **head, int aim){函数
输入是指向链表的头节点的指针head和一个整数aim,用来查找链表,删除目标数值节点
14.如果我们链表的头节点值等于aim
if((*head)->val == aim) {
Node *temp = (*head)->next; //用一个临时节点指针指向下一个节点
free(*head); //将当前节点内存释放
*head = temp; //将当前节点变成原来的头节点的下一个节点
return;// 返回
}
15.如果头结点的值不等于aim,我们创建一个指针
Node *iter = *head; // 方便我们遍历链表
16.开始一个循环,只要iter的下一个节点不为NULL(没有遍历完)
while(iter->next != NULL){
17.如果找到目标节点if(iter->next->val == aim) {
18.我们对目标节点进行删除处理:
Node *temp = iter->next;
iter->next = temp->next;
free(temp);
return;
}
19.如果没有找到目标节点我们继续遍历iter = iter->next;
}
20.我们再声明一个printList函数,用来输出我们的链表
void printList(Node *head) {
while(head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
21.最后我们再声明一个freeList函数,用来释放我们链表中所有节点的空间内存
void freeList(Node *head) {
22.循环遍历释放链表内存while(head != NULL) {
Node *next = head->next;
free(head);
head = next;
}
}
23.然后我们开始我们的主函数int main() {
我们声明三个整数int num, headVal, delVal;分别储存我们链表节点个数,头节点值,要删除的节点值
24.我们读取输入scanf("%d %d", &num, &headVal);
25.分配一个新的节点空间,并将其地址赋值给head指针,作为链表的头节点
Node *head = (Node *)malloc(sizeof(Node));
26.初始化头节点
head->next = NULL;
head->val = headVal;
27.我们将输入数据读取到我们的链表中
for(int i = 0; i < num - 1; i++) {
int aim = 0;
int val = 0;
scanf("%d %d", &val, &aim);
28.调用插入函数插入节点insertNode(head, aim, val);
}
29.读取完数据后还有一个要删除的节点的值需要读取
scanf("%d", &delVal);
30.调用delNode函数
Node *iter = head;
delNode(&head, delVal);
31.调用printList(head);打印删除节点后的链表
32.freeList(head);
33.返回return 0;
}
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <stdlib.h>typedef struct linkedList {int val;struct linkedList *next;
} Node;void insertNode(Node *head, int val, int aim) {while(head != NULL) {if(head->val == aim) {Node *temp = (Node *)malloc(sizeof(Node));temp->val = val;temp->next = head->next;head->next = temp;return;}head = head->next;}
}void delNode(Node **head, int aim) {if((*head)->val == aim) {Node *temp = (*head)->next;free(*head);*head = temp;}Node *iter = *head;while(iter->next != NULL) {if(iter->next->val == aim) {Node *temp = iter->next;iter->next = temp->next;free(temp);return;}iter = iter->next;}
}void printList(Node *head) {while(head->next != NULL) {printf("%d ", head->val);head = head->next;}printf("%d\n", head->val);
}void freeList(Node *head) {while(head != NULL) {Node *temp = head->next;free(head);head = temp;}
}int main() {int num, headVal, delVal;// 读入输入中的节点数量注意数量包括头节点scanf("%d %d", &num, &headVal);// 定义头节点Node *head = (Node *)malloc(sizeof(Node));head->val = headVal;head->next = NULL;// 插入节点for(int i = 0; i < num - 1; i++) {int val;int aim;scanf("%d %d", &val, &aim);insertNode(head, val, aim);}// 删除节点scanf("%d", &delVal);delNode(&head, delVal);printList(head);freeList(head);
}