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