C++学习笔记#18(2021.5.31)

288 阅读1分钟

移除链表元素(力扣No.203)

image.png 这么多年还没真正跑过链表,链表用结构体定义。 结构体定义:

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) {}
};

初始化结构体:

定义和初始化 Date 变量的方式是:先指定变量名,后接赋值运算符和初始化列表,如下:

//ListNode a;
或者
//ListNode b = ListNode(2);
或者
//ListNode c = ListNode(2, &b);
这里还没搞明白。。。

由于是返回头节点,而只有一个head指针,又是单链表,难免会遇到指针不够用的情况(头结点不好处理)。可以定义一个额外的头结点(真头结点),统一节点的操作。 代码:

    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向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;
    }

我在vs上面跑的时候那两行delete释放内存的代码只有注释掉了才能跑通,搜索了一下似乎和内存泄漏有关。挖个坑,后面再补。 6.1 昨天忘记发布了。。尴尬