题目
203. 移除链表元素 - 力扣(Leetcode)https://leetcode.cn/problems/remove-linked-list-elements/description/
思路
由于删除链表结点需要更新上一个结点的指针,所以我们用cur表示当前结点,用prev表示当前结点的上一个结点。
如果当前结点不为空且当前结点的结点值等于给定的val,则需要删除当前结点。删除当前结点可以通过以下做法实现:
- prev->next = cur->next;
- free(cur);
如果当前结点的结点值不等于给定的val,则保留当前结点,将cur移动到下一个结点即可。
当当前结点为空时,链表遍历结束,此时所有结点值等于val的结点都被删除。
需要注意的是:移除头结点和移除其他结点的操作是不一样的,因为链表的其他结点都是通过前一个结点来移除当前结点,而头结点没有前一个结点。
所以头结点如何移除呢?其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。依然别忘将原头结点从内存中删掉。
在单链表中移除头结点和移除其他结点的操作方式不一样,需要单独写一段逻辑来处理移除头结点的情况。
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;
struct ListNode* prev = NULL;
while (cur) // 当前遍历结点非空时循环
{
if (cur->val == val) // 删除
{
if (cur == head) // 头删
{
head = head->next;
free(cur);
cur = head;
}
else // 非头删
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
else // 更新迭代prev和cur指针
{
prev = cur;
cur = cur->next;
}
}
return head;
}