典题:https://pintia.cn/problem-sets/1638739230605864960/exam/problems/1638741702799945728
由于单链表自身不支持向前访问,所以使用双指针的思想:一个先驱和后驱,当后驱等于指定节点时,先驱的后一个节点等于后驱的下一个节点。这道题目并没有给出链表创建的具体步骤,所以我们需要尝试,head是一个指针,或者,head本身就是一个节点。
最终试出头节点本身就是一个节点,所以如果头节点等于指定值,则头节点会被删掉,最终无法返回头节点。所以我们在头节点之前加一个头指针,
然后就可以快乐的看代码了
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* H = (struct ListNode*)malloc(sizeof(struct ListNode));
H->next = head;
struct ListNode* p = H;
struct ListNode* q = H->next;
while(q != NULL) {
if(q->val == val) {
p->next = q->next;
free(q);
q = p->next;
}
else {
p = p->next;
q = q->next;
}
}
return H->next;
}