• [LeetCode]Remove Element


    下面是LeetCode中数组链表的删除操作的题目:

    题目:Remove Element

    删除数组中给定的值的所有元素,返回数组新的大小。

    思路:

    遍历数组,当找到该元素时,和最后的元素交换,删除最后的元素;

    注意:交换并删除最后元素后,位置坐标不应该增加,还需要判断交换过来的原最后的元素是否等于给定的val。

    int LeetCode::removeElement(vector<int>& nums, int val){
        for (size_t i = 0; i < nums.size();){
            if (nums.at(i) == val){//找到val的元素,
                nums.at(i) = nums.at(nums.size() - 1);//和最后的元素交换,
                nums.pop_back();//删除最后的元素
            }
            else ++i;//否则到下一个位置
        }
        return nums.size();
    }

    题目:Remove Duplicates from Sorted Array

    删除已序数组中重复元素,要求空间复杂度O(1)

    思路:

    一个指针记录数组下一个可替换的位置,另一个遍历数组找到所有不重复的元素。

    int LeetCode::removeDuplicates(vector<int>& nums){
        if (nums.size() < 2)return nums.size();
        int i = 0,j = 0;
        for (i = 1; i < nums.size();++i){
            while (i < nums.size() && nums.at(i) == nums.at(i - 1))++i;//调过重复元素
            nums.at(j++) = nums.at(i - 1);//将元素放到j的位置
        }
        if (i == nums.size()){//最后一个元素是不重复的元素时
            nums.at(j++) = nums.at(i - 1);
        }
        nums.erase(nums.begin() + j,nums.end());//删除后面剩余的元素
        return nums.size();
    }

    题目:Remove Linked List Elements

    删除链表中的指定的值的节点。

    Example
    Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
    Return: 1 --> 2 --> 3 --> 4 --> 5

    思路:

    指定元素是头结点时,先循环删除头结点;

    删除后面元素值是指定值的节点。

    ListNode* LeetCode::removeElements(ListNode* head, int val){
        if (!head)return head;
        while (head && head->val == val){//删除头结点
            ListNode* p = head;
            head = head->next;
            delete p;
        }
        ListNode* p = head;
        while (p && p->next){
            if (p->next->val == val){//删除下一个节点
                ListNode* q = p->next;
                p->next = q->next;
                delete q;
            }
            else p = p->next;
        }
        return head;
    }

    题目:Delete Node in a Linked List

    删除单链表中给定的节点,该节点不是尾节点。

    思路:

    删除链表中的节点通常要知道其父节点,这里没有给,又说了不是尾节点,就只能交换值,实际删除当前节点的下一个节点,但是交换了当前节点和下一个节点的值。

    void LeetCode::deleteNode(ListNode* node){
        ListNode* p = node->next;
        node->val = p->val;//交换值
        node->next = p->next;//断开连接
        delete p;
    }
  • 相关阅读:
    实现图片加载时显示百分比思路——serverpush
    我对大项目的看法(定义)
    lucene
    Access常用内置SQL函数
    闰年算法
    DotFuscator使用步骤
    软件加密狗破解思路和方法
    Lucene(.net)学习
    .Net 代码安全保护产品DNGuard HVM使用
    为什么动态创建的控件没有显示出来
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/6783239.html
Copyright © 2020-2023  润新知