题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
#include <stdio.h>
#include <stdlib.h>
/*
*就这么一道题调试了半个多小时,由于涉及多次输入操作,在一次输入未彻底完成前,添加打印信息会失真
*调试出的原因就是在删除节点时,指针指向搞反了
*/
typedef struct ListNode
{
int value;
struct ListNode *pNext;
}listNode;
int main() {
int a, b,num, del;
listNode *head=NULL,*rear=NULL,*tmp=NULL;
while (scanf("%d %d", &num, &a) != EOF) {
head = (listNode *)malloc(sizeof(listNode));
tmp = (listNode *)malloc(sizeof(listNode));
head->pNext=tmp;
tmp->pNext=NULL;tmp->value=a;
//printf("%d %d\n",num,a);
for(int i=0;i<num-1;++i)
{
rear=head->pNext;
scanf("%d %d", &a, &b);
//printf("%d %d ", a, b);
while(rear)
{
if(rear->value==b)
{
tmp=(listNode *)malloc(sizeof(listNode));
tmp->pNext=rear->pNext;
rear->pNext=tmp;tmp->value=a;
break;
}
rear=rear->pNext;
}
}
scanf("%d",&del);
tmp=head->pNext;rear=head;
while(tmp)
{
if(tmp->value==del)
{
if(tmp == head)
{
head=head->pNext;
free(tmp);
tmp=head;rear=head;
}
else {
rear->pNext=tmp->pNext;
free(tmp);
tmp=rear->pNext;
}
}
else {
rear=tmp;tmp=tmp->pNext;
}
}
if(head->pNext==NULL) printf("\n");
else
{
rear=head->pNext;
while(rear)
{
printf("%d ", rear->value);
tmp=rear;rear=rear->pNext;free(tmp);
}
}
}
return 0;
}

查看13道真题和解析