判断是否回文字符串- 双指针技巧
var isPalindrome = function (s) {
let left = 0; right = s.length - 1 // // 一左一右两个指针相向而行
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false
}
left++
right--
}
return true
};
leetcode:234. 回文链表
解题思路:
- 方法一:遍历一遍,把值放入数组中,然后用双指针判断是否回文。时间复杂度O(n)O(n) ,空间复杂度O(n)O(n)
- 方法二:
快慢指针,起初都指向表头,快指针一次走两步,慢指针一次走一步
遍历结束时:要么,slow 正好指向中间两个结点的后一个。要么,slow 正好指向中间结点。
用 prev 保存 slow 的前一个结点,通过prev.next = null断成两个链表。
将后半段链表翻转,和前半段从头比对。空间复杂度降为O(1)
//方法一
var isPalindrome = function (head) {
const vals = []
while (head) {
vals.push(head.val)
head = head.next
}
let left = 0;
right = vals.length - 1 // 一左一右两个指针相向而行
while (left < right) {
if (vals[left] != vals[right]) {
return false
}
left++
right--
}
return true
};
方法二:
var isPalindrome = function (head) {
if (!head || !head.next) {
return true
}
let fast = head,
slow = head
let prev
while (fast && fast.next) {
prev = slow
slow = slow.next
fast = fast.next.next
}
prev.next = null //断成两个链表
//翻转后半段
let head2 = null
while (slow) {
const tmp = slow.next
slow.next = head2
head2 = slow
slow = tmp
}
//比对
while (head && head2) {
if (head.val != head2.val) {
return false
}
head = head.next
head2 = head2.next
}
return true
};