题解 | #牛牛的链表删除#
牛牛的链表删除
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是计数器)