您的位置:首页 > 其它

leetcode第203题-Remove Linked List Elements

2015-04-24 10:14 260 查看
题目要求:从一个链表中删除指定的元素。

分析:首先要考虑链表的非空问题,我想这应该是判断链表和数组问题最首先要考虑处理的问题。其次是如果前几个元素都是与指定元素相同,也要做一次处理,使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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: