Leetcode 203.移除链表元素

文章介绍了如何通过创建虚拟头结点简化链表删除操作,尤其是处理头结点删除的情况,以提高代码整洁性和效率。
摘要由CSDN通过智能技术生成

题源: 203. 移除链表元素

  1. 创建虚拟头结点:函数首先创建一个值为 0 的虚拟头结点 dummyHead。虚拟头结点的 next 指针指向链表的真实头结点 head。这样做的好处是可以统一处理头结点和非头结点的删除操作,特别是当头结点也需要被删除时。

  2. 初始化遍历指针:使用一个指针 cur(当前指针),并将其初始化为指向虚拟头结点 dummyHead。这个指针将用于遍历整个链表。

  3. 遍历链表:使用一个循环,让 cur 指针遍历整个链表。循环的条件是 cur->next 不为 NULL,这意味着只要当前指针的下一个结点存在,循环就会继续。

  4. 删除操作:在每次循环中,首先检查 cur 指针的下一个结点(即 cur->next)的值是否等于给定的 val

    • 如果等于 val,则需要删除这个结点。首先,保存这个要删除的结点的指针到 tmp,然后调整 cur->next 指针,使其指向 tmp 的下一个结点(即 cur->next->next)。这样就从链表中移除了 tmp 指向的结点。之后,释放(删除)tmp 指向的结点的内存。
    • 如果不等于 val,则简单地将 cur 指针移动到下一个结点。
  5. 更新真实头结点:循环完成后,将真实头结点 head 更新为 dummyHead->next,因为在删除过程中,原始的头结点可能已经被删除。

  6. 清理虚拟头结点:在返回新的头结点之前,删除 dummyHead 结点以释放它占用的内存。

  7. 返回更新后的链表头:最后,函数返回新的头结点 head

通过使用虚拟头结点,避免在删除头结点时需要特殊处理的复杂性,并确保了代码的整洁和效率。这种方法在处理链表问题时非常实用,特别是在需要频繁删除头结点或多个连续结点时。

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 创建一个虚拟结点
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值