大概说明
双指针一般用于加快循环速度,多条件查找等情况,比如 搜索nums是否包含target、nums是否存在两个数之和等于target。
留模板自用~
搜索nums是否包含target
java
public static int search(int[] nums, int target) {
int len = nums.length;
int l = 0 ,r = len - 1;
//记录目标值下标
int index = -1;
while(l < r){
int mid = (r-l) / 2 + l;//求出中间下标 (数据类型)
if(nums[mid] > target) r--; //大于目标值 移动右指针
else if(nums[mid] < target) l++; //小于目标值 移动左指针
else{
index = mid;//等于目标值 记录下标值 结束循环
break;
}
}
return index;
}
nums是否存在两个数之和等于target
java
public static int[] getSum(int[] nums, int target) {
Arrays.sort(nums);
int len = nums.length;
int l = 0 ,r = len - 1;
int[] ans = new int[2];
while(l < r){
int num = nums[l] + nums[r];// 求和
if(num > target) r--; //大于目标值 r左移减少
else if(num < target) l++; //小于目标值 l右移增大
else{
ans[0] = nums[l];//等于目标值结束循环
ans[1] = nums[r];
break;
}
}
return ans;
}
快慢指针 删除倒数第N个节点
java
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode();
dummyNode.next = head;
ListNode fastNode = dummyNode;
ListNode slowNode = dummyNode;
// fastNode 先走n步,slowNode在原点,它们相距5步
while (n-- > 0 && fastNode.next != null) {
fastNode = fastNode.next;
}
// fastNode 走完的时候,slow刚好是倒数n个
while (fastNode.next != null) {
fastNode = fastNode.next;
slowNode = slowNode.next;
}
// 此时slowNode就是待删除节点的前一个节点
slowNode.next = slowNode.next.next;
return dummyNode.next;
}