LeetCode203移除链表
思路:
删除节点需要考虑两种情况,节点在头部和尾部的情况,节点在头部,也就是head->val=val的情况,还需要考虑要是连续出现需要删除的节点要怎么处理
当出现在头部的时候可以设置一个临时指针temp指向head,head=head->next,然后释放掉temp即可;
当出现在尾部的时候,我们需要考虑循环条件,指针是否会跳到最后一个节点,单指针的情况下,如果跳到最后一个节点,判断与val相等,需要删掉最后一个节点,此时是无法找到当前指针的上一个节点,会出现问题,如果需要处理的话那么和其余节点的操作就会不同,没有适用性;所以我们可以考虑指针不跳到最后一个节点,即判断条件为(p!=NULL&&p->next!=NULL),p的初始指向head,head我们在之前已经进行过判断,所以每一次我们只需要判断p的下一个是否等于val即可,在判断最后一个时,也就是p->next的val值符合删除条件,那么我们只需要设置一个临时指针temp指向p->next,然后让p->next指向temp->next,也就是NULL,最后释放temp即可
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
// 处理链表为空的情况
if (head == NULL) {
return NULL;
}
// 移除链表开头连续等于 val 的节点
while (head != NULL && head->val == val) {
struct ListNode* temp = head;
head = head->next;
free(temp); // 释放内存
}
struct ListNode *p = head;
while (p != NULL && p->next != NULL) {
if (p->next->val == val) {
struct ListNode* temp = p->next;
p->next = p->next->next;
free(temp); // 释放内存
} else {
p = p->next;
}
}
return head;
}