移除链表元素(力扣No.203)
这么多年还没真正跑过链表,链表用结构体定义。
结构体定义:
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 昨天忘记发布了。。尴尬