题解 | #牛牛的链表删除#
牛牛的链表删除
https://www.nowcoder.com/practice/d3df844baa8a4c139e103ca1b1faae0f
# include<stdio.h>
# include<string.h>
# include <stdlib.h>
struct math {
int x;
struct math* next;
};
struct math* makelist(int b[],int y);
struct math* makelist(int b[],int y)
{
struct math* data = NULL;
for (int i = 0; i < y; i++) {
struct math* temp = (struct math*)malloc(sizeof(struct math)) ;
(temp->x) = b[i];
if (data == NULL) {
data = temp;
temp->next = NULL;
} else {
temp->next = data;
data = temp;
}
}
return data;
}
void scanff(int a[],int b[],int y);
void scanff(int a[],int b[],int y)
{
for (int i = 0; i < y; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < y; i++)
{
b[i] = a[y - 1 - i];
}
}
void delet(struct math**data,int m);
void delet(struct math**data,int m)
{
struct math * cur=*data;
struct math * pre=NULL;
while(cur!=NULL&&cur->x!=m)
{
pre=cur;
cur=cur->next;
}
if(pre==NULL)
{
*data=cur->next;
}
else
{
//释放
pre->next=cur->next;
free(cur);
}
}
int main() {
int y;
int a[99];
int b[99];
scanf("%d", &y);
int m;
scanf("%d",&m);
scanff(a,b,y); //第一个列表
struct math* data=makelist(b,y);
struct math* data2=data;
/*while(data2!=NULL)
{
delet(&data,m);
data2=data2->next;
}*/
int i=0;
while(data2!=NULL)
{
if(data2->x==m)
{
i++;
}
data2=data2->next;
}
for(int j=0;j<i;j++)
{
delet(&data,m);
}
struct math* data3=data;
while (data!= NULL) {
printf("%d ", data->x);
data = data->next;
}
while(data3!=NULL)
{
struct math* data4=data;
data3=data3->next;
free(data4);
}
return 0;
}
达到删除节点的效果是把前一节点的尾指针(->next)修改为此节点的尾指针。
copy之前的代码,发现我们前一节点的值无法储存,所以再声明两个指针(一个是上一个节点,一个是现在节点),用来遍历,调整链表,而头指针就不要动。
删除时要考虑一个情况:上一个节点不存在即第一个节点。直接修改头指针为头指针的下一个节点。
delete函数只删除一个节点,我们不妨重复delete函数,而重复次数则再需要一个int i来承担。再申请一个指针data2用来遍历,用if判断,if为真则i++;
此外养成一个好习惯:随时free;
悟:要明白每个变量的意义(效果)。(头指针遍历一遍后就为空值了,所以要修改链表都是再申请一个指针,而不是直接用头指针,i是计数器)
文远知行公司福利 580人发布