Leecode-27-移除元素
题目
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例
示例1
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例2
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
解题思路
由题,容易想到通过for循环遍历,查找指定要删除的数据val,再嵌套一层for循环,将val后面的元素分别前移一位
但是,这样会导致超时
那么此时,返回题目“元素的顺序可以改变”,因此,当遍历到val时,将该数组的最后一个元素移到val的位置,并给数组元素数量numsSize减1,表示删除了一个val元素,再继续从val的位置判断该元素是否等于val,若该元素的值不等于val,则移动指针指向下一个元素
最后,返回数组元素数量numsSize
代码实现
int removeElement(int* nums, int numsSize, int val) {
for(int i = 0; i < numsSize; ){
if(nums[i] == val){
nums[i] = nums[numsSize - 1];
numsSize--;
}
else{
i++;
}
}
return numsSize;
}
Leecode-203-移除链表元素
题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例
示例1
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例2
输入:head = [], val = 1
输出:[]
示例3
输入:head = [7,7,7,7], val = 7
输出:[]
解题思路
- 双指针
- 对链表进行判空操作
- 循环判断头结点的数据域的值是否为指定要删除的数据,若是,使头节点等于头节点的下一个节点
- 创建两个辅助指针变量,同时指向头结点
- 移动两个指针变量
- 返回头节点
- 递归
- 对链表进行判空操作
- 递归
代码实现
双指针
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head == NULL){
return head;
}
while(head != NULL&& head -> val == val){
head = head -> next;
}
struct ListNode* pPrev = head;
struct ListNode* pCurrent = head;
while(pCurrent){
if(pCurrent -> val == val){
pPrev -> next = pCurrent -> next;
}
else{
pPrev = pCurrent ;
}
pCurrent = pCurrent -> next;
}
return head;
}
递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head == NULL){
return head;
}
struct ListNode* res = removeElements(head -> next, val);
if(head -> val == val){
return res;
}
else{
head -> next = res;
return head;
}
}