• 有序数组原地去重
      1. int removeDuplicates(vector<int>& arr, int k){
      2. int index=k;
      3. for(int i=k;i<arr.size();++i){
      4. if(arr[i]!=arr[index-k]){
      5. arr[index++]=arr[i];
      6. }
      7. }
      8. return index;
      9. }

    • 有序链表原地去重

    用快慢指针

    1. ListNode* removeDupLink(ListNode* head){
    2. if(head==nullptr||head->next==null) return head;
    3. ListNode* slow=head;
    4. ListNode* fast=head;
    5. while(fast!=nullptr){
    6. if(fast->val!=slow->val){
    7. slow->next=fast;
    8. slow=fast;
    9. }
    10. fast=fast->next;
    11. }
    12. slow->next=nullptr;
    13. return head;
    14. }

    有序表原地去重 - 图1


    • 移除元素

    有序表原地去重 - 图2
    默写快慢指针

    1. int moveValueTail(vector<int>& arr, int val){
    2. int slow=0;
    3. int fast=0;
    4. while(fast<arr.size()){
    5. if(arr[fast]!=val){
    6. arr[slow]=arr[fast];
    7. slow++;
    8. }
    9. fast++;
    10. }
    11. return slow;
    12. }

    • Leetcode 283 移动零

      给你输入一个数组nums,请你原地修改,将数组中的所有值为 0 的元素移到数组末尾

    题目让我们将所有 0 移到最后,其实就相当于移除nums中的所有 0,然后再把后面的元素都赋值为 0 即可。

    void moveZero(vector<int>& arr){
         int position=moveValueTail(arr,0);   
        for(int i=position;i<arr.size();++i){
            arr[i]=0;
        }
    }