题目
示例答案
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->next = head;
struct ListNode* p = dummy;
while (p->next != NULL) {
if (p->next->val == val) {
struct ListNode* temp = p->next;
p->next = temp->next;
free(temp);
} else {
p = p->next;
}
}
head = dummy->next;
free(dummy);
return head;
}
理解
dummy是声明的一个哑结点,指向链表的头结点head;哑结点的作用是简化边界条件的处理,使得删除头结点和删除其它结点的操作统一。
同时定义了结点p,初始化指向哑结点,p是为了向后进行遍历链表。
while循环的条件是p的下一个结点不为空。循环内部,检查p的下一个结点的值是否与val相等,如果相等,就是用声明的临时节点temp指向要删除的结点,然后进行删除操作,如果不相等,p就移向下一个结点
循环结束后将哑结点的下一个结点赋值给head,释放哑结点,返回head