解题思路
1.通常要删除一个节点,我们需要得到它前面的一个节点,因此当要删除的节点是第一个节点时就要单独处理,特别是这里还有可能多次删除第一个节点。这种情况下可以在链表前人为添加一个节点,以其为开始就不用考虑上述问题了,即设立新的存储指针p来替换掉head,之后要返回操作后的链表时直接返回p->next即可。
2.指针顺着链表操作时while循环中的判断条件不一定是操作指针本身,其应当为每次操作的对象,如这里每次操作的就是q->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;}elseq = q->next;}return p->next;
}