代码随想录算法训练营第三天 | 链表理论基础 | 203.移除链表元素

  • 感觉上是可以轻松完成的,因为对链接的结构,元素的删除过程心里明镜似的

  • 实际上四处跑气

    • 结构体的初始化好像完全忘掉了,用malloc折腾半天,忘记了用new,真想扇自己嘴巴子到飞起
    • 删除后写一个函数,把链表打印出来,对于有些数据始终报段错误,后来发现是removeElements函数的返回值没有重新给头指针赋值,导致还指向已被删除的空间
  • 现在这些知识点自己还是有些基础的,但完全手生到跟没学一样啊

  • #include <iostream>
    
    struct ListNode {
        int val = 0;
        ListNode* next;
        ListNode(): val(0), next(nullptr) {}
        ListNode(int v): val(v), next(nullptr) {}
        ListNode(int v, ListNode* _next): val(v), next(_next) {}
    };
    
    class Solution {
    public:
        ListNode* removeElements(ListNode* head, int val) {
            if (head == nullptr) return nullptr;
            auto* visualHead = new ListNode(0);
            visualHead->next = head;
            for (auto *p = visualHead; p->next != nullptr;) {
                if (p->next->val == val) {
                    auto* temp = p->next;
                    p->next = p->next->next;
                    delete temp;
                } else p = p->next;
            }
            head = visualHead->next;
            delete visualHead;
            return head;
        }
        void show(ListNode* head) {
            for (auto* p = head; p != nullptr; p = p->next)
                std::cout << p->val << " ";
            std::cout << std::endl;
        }
    };
    
    int main()
    {
        int del_val;
        std::cin >> del_val;
    
        ListNode* p = nullptr;
        for (int val; std::cin >> val; p = new ListNode(val, p));
    
        std::cout << del_val << std::endl;
        Solution s;
        p = s.removeElements(p, del_val);
        s.show(p);
        return 0;
    }
    // 执行后输入5 5 5 3 2 5 5 1 a
    // 第一个5表示要删除的值,最后一个a表示输入结束,一开始会反向生成链表1->5->5->2->3->5->5->5,然后再把5的结点删除
    
  • 测试代码耗时至少二个小时

  • 在测试时发现,对链接的边界处的值设定与安排还是一头雾水,思想深刻度与对链表更精深的理解还不到位

  • 当天其它题目:设计链表

  • 当天其它题目:反转链表

  • 汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值