解题思路
1.通常要删除一个节点,我们需要得到它前面的一个节点,因此当要删除的节点是第一个节点时就要单独处理,特别是这里还有可能多次删除第一个节点。这种情况下可以在链表前人为添加一个节点,以其为开始就不用考虑上述问题了,即设立新的存储指针p来替换掉head,之后要返回操作后的链表时直接返回p->next即可。
2.指针顺着链表操作时while循环中的判断条件不一定是操作指针本身,其应当为每次操作的对象,如这里每次操作的就是q->next。
题目
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *q = p;
q->next = head;
while(q->next)
{
if(q->next->val == val)
{
struct ListNode *r = q->next;
q->next = r->next;
free(r);
r = NULL;
}
else
q = q->next;
}
return p->next;
}