uacs2024

导航

leetcode203-移除链表元素(单链表带头结点和不带头结点删除特定元素)

203. 移除链表元素

 

这里的做法是遍历找到需要删除的结点的前一个结点,但由于题目没有给出头结点,所以就有先删除开头符合条件的结点设置虚拟头结点两种做法

一、释放内存free和delete的区别:

        1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间

  2. delete [] 用于释放 new [] 分配的空间
  3. delete 释放空间的时候会调用 相应对象的析构函数,new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存
  4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL
  5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放
所以c++释放内存用delete p;
二、只有当前指针所指向的下一个结点的值不是目标值才能够p=p->next;  
  一开始因为都p=p->next;就溢出出错了
/**
 * 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) {
        while(head&&head->val==val)
        {
            auto t=head;
            head = head->next;
            delete t;
        }
        ListNode *p=head;
        while(p&&p->next)
        {
            if(p->next->val==val)
            {
                auto t = p->next;
                p->next=p->next->next;
                delete t;
            }
            else
            {
                p=p->next;
            }
        }
        return head;
    }
};
/**
 * 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; // 将虚拟头结点指向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;
    }
};

 

posted on 2022-09-13 18:16  ᶜʸᵃⁿ  阅读(29)  评论(0编辑  收藏  举报