lintcode(E) 删除链表中的元素

来源:互联网 发布:java开发工程师是什么 编辑:程序博客网 时间:2024/05/07 14:49

删除链表中的元素

描述
笔记
数据
评测
删除链表中等于给定值val的所有节点。

您在真实的面试中是否遇到过这个题? Yes
样例
给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。

最开始我的代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    /**     * @param head a ListNode     * @param val an integer     * @return a ListNode     */    ListNode *removeElements(ListNode *head, int val) {        // Write your code here        if(head==NULL) return NULL;      ListNode* pre;        pre->next=head;        ListNode* p=pre;        while(p->next){            if(p->next->val==val){                ListNode *q=p->next;                if(q->next) p->next=q->next;                free(q);            }        }        return pre->next;    }};

然后通过率18%,
错误点:if(q->next)这个判断没有必要,链表是1->2->3->null;
之前加这个判断,是想着,如果要删除3这个结点的话,null后面没有后继,但是删除3后,自然不会循环下去,如果加了这个判断,直接删了3结点
另外一个点是pre应该new ListNode(X),这个我知道,但是我没有。。。
还有就是c和C++搞混

正确版

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    /**     * @param head a ListNode     * @param val an integer     * @return a ListNode     */    ListNode *removeElements(ListNode *head, int val) {        // Write your code here      ListNode* pre=new ListNode(-1);        pre->next=head;        ListNode* p=pre;        while(p->next){            if(p->next->val==val){                ListNode *q=p->next;                 p->next=q->next;               q->next=NULL;                delete q;            }           else p=p->next;        }        return pre->next;    }};
0 0