双指针总结
数组 移除某一个元素
快慢一起向后遍历 ,遇到要删除的元素。快先走 ,然后快指针直接覆盖要删除的元素
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;
}
}
反转字符串或者数组问题
一头一尾指针
头尾向中间间遍历,并交换,直至之间相遇
字符串 中某一种字符 替换,剑指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) 和当前指针向后移动一位 遍历到下一个节点
}
}
标签:ListNode,cur,int,pred,day10,节点,指针
From: https://www.cnblogs.com/wdnmdp/p/16746225.html