题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6
删除val=6的节点后: 1 -> 2 -> 3 -> 4 -> 5
输入: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
输出:[]
题解
C语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
// 增加一个虚拟头节点,这样dummyHead不需要移动,其next就是新的头节点
struct ListNode *dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));
dummyHead->next = head;
struct ListNode *curNode = dummyHead;
while (curNode->next != NULL) {
// 找到待删除的节点
if (curNode->next->val == val) {
// 先保存待删除的节点,再摘链,最后释放资源
struct ListNode *tmp = curNode->next;
curNode->next = curNode->next->next;
// 释放要删除节点的资源
free(tmp);
} else {
curNode = curNode->next;
}
}
// 更新头节点 释放dummyHead
head = dummyHead->next;
free(dummyHead);
return head;
}