题目如下;
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
结构体定义:
typedef struct Node {
char val;
struct Node* next;
}Node;
文章目录
第一部分
List head, tail;
Node* p, * p1;//p1用来删除节点
p = (Node*)malloc(sizeof(struct Node));
p1 = (Node*)malloc(sizeof(struct Node));
int ch, val;
head = p;
tail = p;
head->next = NULL;
printf("请输入链表的内容");
while ((ch = getchar()) != '\n') {
if (ch == ' ') {
continue;
}
p = (Node*)malloc(sizeof(struct Node));
p->val = ch-48;
tail->next = p;
tail = p;
tail->next = NULL;
}
这部分主要是创建链表并且输入内容
第二部分
tail = head;//让tail指向头节点
printf("请输入你要删除的值");
scanf("%d", &val);
while (tail->next != NULL) {
if (tail->next->val == val) {
if (tail->next->val == val && tail->next->next == NULL) {
p1 = tail->next;
free(p1);
tail->next = NULL;
break;
}
else {
p1 = tail->next;
tail->next = p1->next;
free(p1);
}
}
else
tail = tail->next;
}
while (head->next != NULL) {
head = head->next;
if (head->val >= 0) {
printf("%d ", head->val);
}
else
break;
}
return 0;
这部分我们进行查找并且进行删除操作,如果我们找到了我们要删除的值,还有进行判断,判断该节点是否为尾节点,如果是尾节点,那么我们就用p1指针释放尾节点的内存,并且让新的尾节点的next指向NULL并退出循环。
如果不是尾节点,那么依然用p1指针进行释放,并且让tail指向p1的next。
当这些操作完成之后,我们就可以进行打印,
在这里我们要注意一下,如果节点里的值为负数,那么可能就是我们指向到了分配内存空间以外的空间,这时我们就需要赶紧退出循环。
至此,代码结束。