定义两个指针,一个快指针,一个慢指针,慢指针只有在满足某一条件后才会向前移动,而快指针一般用于遍历整合数组或链表
力扣 27 :移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
int val; //表示 要删除的元素
int[] nums = {};//数组
int slow = 0;
//slow用于指向新数组的下标
// quick 用于指向 新数组
for(int quick= 0; quick<nums.length;quick++){
//只有单快指针不等于 val时(在没遇见目标元素之前 quick 一直等于 slow)
if(nums[quick] != val){
nums[slow] = nums[quick];
slow++;
}
//走这里 说明 快指针 等于 val,慢指针停留在 val这里,进行下一个循环 快指针一直往后找,直到 nums[quick] != val;,然后将 nums[quick]的值 赋给 慢指针位置,就相当于用不为val的值 去覆盖了val,删除了val
}
//最后返回 数组下标
return slow;
力扣 141 :环形链表
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
ListNode slow = head;
ListNode quick = head;
while(quick !=null){
//慢指针走一步
slow = slow.next;
//快指针走两步
if(quick.next == null){
//说明 快指针下一步为空,则说明一定不存在环,如果存在环,那么快指针是一定不会指空的
return false;
}
quick = quick.next.next;
//若快慢指针指向同一个地址,说明有环
if(slow == quick){
return true;
}
}
//说明无环
return false;