题目描述:
解题思路:
使用双指针算法,指针p1指向列表的首元素,指针p2指向列表的末尾元素,使用res记录返回值
- 1.当指针p2指向的元素等于val时,此时val已经在末尾了,因此需要将指针p2前移一位即可,并且continue,直到指针p2移动到不等于val的位置
- 2.当指针p1指向的元素等于val时,由于此时p2指向的元素不等于val,但是指针p2之后的元素等于val,因此将p1位置的元素与p2位置元素交换即可
- 3.while循环结束条件:p1<=p2
时间复杂度O(n)
空间复杂度O(1)
实现代码:
cpp
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int p1 = 0;
int p2 = nums.size()-1;
int res = 0;
while(p1 <= p2){
if(nums[p2]==val){
p2--;
continue;
}
if(nums[p1]==val){
nums[p1] = nums[p2];
p1++;
p2--;
res++;
}else{
p1++;
res++;
}
}
return res;
}
};