定义
双指针:指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,使用两个指针来达到目的
- 对撞指针:一个左指针(首部),一个右指针(尾部)。
- 快慢指针:以不同策略在相同方向上移动。
代码:
练习一:反转字符串(对撞指针)
练习地址:https://leetcode-cn.com/problems/reverse-string/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路:在js中可以用reverse()的库函数来完成,但是也可以熟练一下双指针的原理
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
const n = s.length;
for(let left = 0, right = n - 1; left < right; left++, right--) {
[s[left], s[right]] = [s[right], s[left]];
}
return s
};
练习二: 链表的中间结点(快慢指针)
练习地址:https://leetcode-cn.com/problems/middle-of-the-linked-list/
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路:除了可以用单指针循环一遍之后,再循环到中间位置输出。还可以使用快慢指针。慢指针走一步,快指针走两步,当快指针走到结尾,慢指针就走到了中间位置。
题解链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/876-lian-biao-de-zhong-jian-jie-dian-by-1wn6b/
时间复杂度O(N),空间复杂度O(1)。
var middleNode = function(head) {
let slow = head, fast = head;
while(fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
};
练习三:删除链表的倒数第 N 个结点(快慢指针)
练习地址:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
思路: 快指针多走n步,慢指针的下一个结点就是要删除的结点。
var removeNthFromEnd = function(head, n) {
let slow = head, fast = head, tempNum = 0;
while(n--) {
fast = fast.next;
}
if(!fast) {
return head.next
}
while(fast && fast.next) {
slow = slow.next;
fast = fast.next;
}
if(slow.next) {
slow.next = slow.next.next;
} else {
slow.next = null;
}
return head;
};
练习四:917. 仅仅反转字母(快慢指针)
练习地址:https://leetcode-cn.com/problems/reverse-only-letters/
给你一个字符串 s ,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
解题思路:反转字符串(练习一)的升级版。
代码
var reverseOnlyLetters = function(s) {
const sArr = s.split('');
for(let left = 0, right = sArr.length - 1; left < right; right--, left++) {
while(!/[a-zA-Z]/ig.test(sArr[left]) && left < right) {
left++;
}
while(!/[a-zA-Z]/ig.test(sArr[right]) && left < right) {
right--;
}
[sArr[left], sArr[right]] = [sArr[right], sArr[left]];
}
return sArr.join('');
};
本文详细介绍双指针算法的应用,包括对撞指针、快慢指针等技巧,并通过四个LeetCode实战题目进行深入解析,帮助读者掌握该算法的核心思想。

7913

被折叠的 条评论
为什么被折叠?



