day10

双指针总结

数组 移除某一个元素
image
快慢一起向后遍历 ,遇到要删除的元素。快先走 ,然后快指针直接覆盖要删除的元素

class Solution {
    public int removeElement(int[] nums, int val) {
        // 快慢指针![image](uploading...)
        int slowIndex = 0;   //快指针是用来找数 慢指针才是用来保存删除某个数之后的数组
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}

反转字符串或者数组问题image

一头一尾指针
头尾向中间间遍历,并交换,直至之间相遇

字符串 中某一种字符 替换,剑指offer P51

用双指针 比较麻烦 ,直接使用StringBulider 可变长数组,从头遍历过去O(n)

链表的反转

//双指针法
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur=head;  //cur 头结点开始   pred  空节点开始
        ListNode pred=null;


        while(cur!=null){
            ListNode temp=cur.next;      //temp保存  cur之后的指向 防止断连
            cur.next=pred;              //反转cur 的指向 反转链表
            pred=cur;                   //pred  到下一个位置 也就是 cur
            cur=temp;           //cur 到下一个位置    也就是 一开始 temp的位置
        }
        return  cur;    //经过遍历之后 cur 指向了null 最后终止循环, 所以  头节点应该是pred

//反转一个节点的顺序 :
//  1:先把该节点的下一个节点保存
//  2:反转该节点的方向
//  3: 该节点的前一个指针(先移动pred 再移动cur) 和当前指针向后移动一位  遍历到下一个节点
    }
}

posted on 2022-09-30 20:50  你是千堆雪我是长街7  阅读(5)  评论(0)    收藏  举报

导航