题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
思路:
我们知道,链表是由地址不联系的节点构成的,所以我们只需找到与
val
值相对应的节点,并将其从链表中剔除即可!
由此图可知,
cur
所指向的节点需要被删除,那么我们就只需要吧cur的前节点prev
的next
连接到cur的后节点next
即可,并将cur的节点进行free处理
但是上述仅为一般情况,假设有以下情况:
此时的prev为空指针,即不可以像上述指向next。
并且该题目要求返回head指针,则我们仅需要更新head,并将cur进行free。
代码:
/*
解题思路:从头节点开始进行元素删除,每删除一个元素,需要重新链接节点
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head == NULL)
return NULL;
struct ListNode* cur = head;
struct ListNode* prev = NULL;
while(cur)
{
//删除节点
if(cur->val == val)
{
//首先保存下一个节点
struct ListNode* next = cur->next;
//如果删除的为头节点,更新头节点
//否则让当前节点的前趋节点链接next节点
if(prev == NULL)
{
head = cur->next;
}
else
{
prev->next = cur->next;
}
//释放当前节点,让cur指向next
free(cur);
cur = next;
}
else找节点
{
//如果cur不是需要删除的节点,则更新prev,cur
prev = cur;
cur = cur->next;
}
}
return head;
}
我们在删除节点的代码部分添加了判断
prev
是否为空
若为空,则更新head
若不为空,则使prev
指向next