22、给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例1
输入:
{2,5,1,9},5
返回值:
{2,1,9}
复制
说明:
给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
示例2
输入:
{2,5,1,9},1
返回值:
{2,5,9}
说明:
给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9
思路
将所输入的值组成链表,然后一次遍历链表将所需要删除的内容删除即可。
具体实现
# include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 10000
// 链表结构体
struct ListNode {
int val;
struct ListNode* next;
};
// 删除链表中指定值的节点,返回链表头指针
struct ListNode* deleteNode(struct ListNode* head, int val) {
// 处理头结点为待删除结点的情况
if (head != NULL && head->val == val) {
struct ListNode* temp = head;
head = head->next;
free(temp);
return head;
}
// 处理其他结点为待删除结点的情况
struct ListNode* prev = head;
struct ListNode* curr = head->next;
while (curr != NULL && curr->val != val) {
prev = curr;
curr = curr->next;
}
if (curr != NULL) {
prev->next = curr->next;
free(curr);
}
return head;
}
// 创建链表的函数
struct ListNode* createList() {
char str[MAX_LEN];
int num[MAX_LEN];
int n,i,j=0;
// 将输入的内容按照字符串读入
scanf("%s", str);
// 读取字符串中不含‘{’‘}’的内容
for (i = 0; str[i] != '}'; i++) {
if (str[i] != '{') {
str[j++] = str[i];
}
}
// 读取要删除的数字
n = int(str[j+3]-'0');
str[j] = '\0'; // 确保新字符串以 '\0' 结尾
// 分割字符串并转换为数字
i=0;
char *token = strtok(str, ",");
while (token != NULL) {
num[i++] = atoi(token);
token = strtok(NULL, ",");
}
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = num[0];
head->next = NULL;
struct ListNode* p = head;
for (j = 1; j < i; j++) {
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = num[j];
node->next = NULL;
p->next = node;
p = p->next;
}
// 删除节点
deleteNode(head, n);
return head;
}
// 打印链表的函数
void printList(struct ListNode* head) {
struct ListNode* current = head;
printf("{");
while (current != NULL) {
printf("%d", current->val);
current = current->next;
if(current != NULL)
printf(",");
}
printf("}");
printf("\n");
}
int main() {
struct ListNode* list = createList();
printList(list);
return 0;
}
小结
本次算法不算困难,但是其中的输入以及输出的格式需要小心和注意。