下面是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;
}