题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/
📕题目要求:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
🧠解题思路
方案一:直接删除
设置两个指针,prev 和 cur,分别指向NULL,和 head。若 cur->val 不等于 val,则将 cur 和 prev->next 连接起来。否则将 cur 指向 cur->next 再次进行判断,并且 free(cur)。
这里需要考虑如果头结点就等于 val 的情况!
方案二:尾插
遍历当前的链表,把不等于 val 的结点拿下来尾插。
🍭代码示例
方案一代码示例如下:
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while(cur!=NULL)
{
if(cur->val==val)
{
if(prev==NULL)
{
head = cur->next;
free(cur);
cur = head;
}
else
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
else
{
prev = cur;
cur = cur->next;
}
}
return head;
}
方案二代码示例如下:
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;
struct ListNode* newhead = NULL;
struct ListNode* tail = NULL;
while(cur!=NULL)
{
if(cur->val!=val)
{
if(tail==NULL)
{
newhead=tail=cur;
}
else
{
tail->next = cur;
tail = tail->next;
}
cur=cur->next;
tail->next = NULL;
}
else
{
struct ListNode* del = cur;
cur = cur->next;
free(del);
}
}
return newhead;
}
这就是我对本题的理解,如果大家有更优的解,欢迎交流,一起进步!