双指针是一种常见的算法技巧,主要用于解决一些数组或链表相关的问题。以下是几个常见的问题,可以使用双指针来解决:
-
链表中的两数之和:给定一个有序链表和一个目标值,在链表中找到两个数,使它们的和等于目标值。双指针可以同时从链表的头部和尾部开始向中间移动,通过比较当前两个指针所指节点的值与目标值的大小关系,进行逐步逼近。
-
有序数组的两数之和:给定一个有序数组和一个目标值,在数组中找到两个数,使它们的和等于目标值。可以使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置,根据当前两个指针所指元素的和与目标值的大小关系,逐步逼近目标值。
-
判断链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果存在环,快指针最终会追上慢指针,即两个指针会相遇。这是因为在有环的情况下,快指针相当于在环上绕了一圈,追上了慢指针。
-
寻找链表的中间节点:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为链表的中间节点。
-
数组去重:对于已排序的数组,可以使用两个指针,一个指向当前要保留的元素位置,另一个指向当前遍历到的元素位置,通过比较两个指针指向的元素是否相等,实现去重的目的。
6.找倒数第k个节点
这种方法的思路是通过让快指针先移动k个位置,然后再同时移动两个指针,保持它们之间的距离为k,当快指针到达链表末尾时,慢指针所指的位置就是倒数第k个节点。然后同时移动快指针和慢指针,直到快指针达到链表的末尾。这样,慢指针所指的节点就是倒数第k个节点。
-
链表中的两数之和:给定一个有序链表和一个目标值,在链表中找到两个数,使它们的和等于目标值。双指针可以同时从链表的头部和尾部开始向中间移动,通过比较当前两个指针所指节点的值与目标值的大小关系,进行逐步逼近。
-
有序数组的两数之和:给定一个有序数组和一个目标值,在数组中找到两个数,使它们的和等于目标值。可以使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置,根据当前两个指针所指元素的和与目标值的大小关系,逐步逼近目标值。
-
判断链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果存在环,快指针最终会追上慢指针,即两个指针会相遇。这是因为在有环的情况下,快指针相当于在环上绕了一圈,追上了慢指针。
-
寻找链表的中间节点:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为链表的中间节点。
-
数组去重:对于已排序的数组,可以使用两个指针,一个指向当前要保留的元素位置,另一个指向当前遍历到的元素位置,通过比较两个指针指向的元素是否相等,实现去重的目的。
-
找倒数第k个节点创建两个指针,分别称为快指针和慢指针。将快指针指向链表的头节点,并让快指针先向前移动k个位置。
def findKthFromEnd(head, k):
slow = fast = head
# 先将快指针移动到第k个节点处
for _ in range(k):
if fast is None:
return None # 处理链表长度小于k的情况
fast = fast.next
# 同时移动快指针和慢指针,直到快指针达到链表末尾
while fast is not None:
fast = fast.next
slow = slow.next
return slow