题目要求:从一个链表中删除指定的元素。
分析:首先要考虑链表的非空问题,我想这应该是判断链表和数组问题最首先要考虑处理的问题。其次是如果前几个元素都是与指定元素相同,也要做一次处理,使head指向(在非空的情况下)与指定元素不相等的第一个元素。注意:在这里我碰到了一个很可笑的问题,就是while里面循环的判断条件,应该让head!=NULL在前面,这样就能保证head->val的值的问题,一直在这里出问题,后来才检查出来。然后再定义两个指针,第一个指针p指向当前的元素,第二个指针指向下一个节点,剩下的判断就应该很简单了。
#include<stdio.h> #include<stdlib.h> struct ListNode { int val; struct ListNode *next; }; ListNode* removeElements(ListNode *head,int val) { if (head==NULL) return NULL; struct ListNode *p, *q; while ((head != NULL)&&(head->val) == val) { p=head->next; free(head); head=p; } if (head==NULL) return NULL; p=head; q=head->next; while ((q!=NULL)) { if (q->val != val) { p=q; q=q->next; } else { p->next = q->next; free(q); q=p->next; } } return head; } int main() { int m; while(scanf("%d",&m)!=EOF) { ListNode *head=(ListNode *)malloc(sizeof(ListNode)); ListNode *p=head; head->next=NULL; for(int i=0;i<m;i++) { int tmp; scanf("%d",&tmp); ListNode *q=(ListNode *)malloc(sizeof(ListNode)); q->val=tmp; p->next=q; p=q; p->next=NULL; } int n; scanf("%d",&n); ListNode *h=removeElements(head->next,n); while(h) { printf("%d ",h->val); h=h->next; } printf("\n"); } return 0; }
时间: 2024-10-10 04:43:33