移除链表元素(C Language)

题目

203. 移除链表元素 - 力扣(Leetcode)icon-default.png?t=N176https://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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aspect of Twilight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值