给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
方法:传统求解
利用传统的方法遍历各个节点,判断节点的数据是否为VAL
方法:
struct ListNode* prev = NULL; //删除需要prev和cur
struct ListNode* cur = head;
//逻辑为:prev->next == next
新建两个结构体指针,通过prev->next == next串联起整个链表。
需要注意的是:此方法需要额外注意头删!(prev是空指针,不可以解引用)
头删时,head需要后移一个节点。
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* prev = NULL; //删除需要prev和cur
struct ListNode* cur = head;
//逻辑为:prev->next == next
while(cur)
{
if(cur->val == val)
{
if(prev){
prev->next = cur->next; //② //prev最开始是空指针,不能解引用(->)
free(cur);
cur = prev->next; // ①
//通过①②语句,链接起整个链表;
}
else{
head = cur->next;
free(cur);
cur = head;
}
}
else
{
prev = cur;
cur = cur->next;
}
}
return head;
}