【leetcode】234. 回文链表

95 阅读1分钟

leetcode-234.png

翻转链表的一题 这里很多人刚开始思考的时候,拿起来就是直接反转整个链表,然后拿着整个链表与之前的相比,但是这里存在一个问题,反转整个链表会改变链表的结构,导致出错,这里只需要反转部分即可,利用快慢指针找出后半部分,然后进行反转,再进行比较即可

var isPalindrome = function (head) {
    if (!head) return true
    let slow = head, fast = head
    let left = head
    // 找到一半处
    while (fast && fast.next) {
        slow = slow.next
        fast = fast.next.next
    }
    // 反转后半部分即可
    let right = reverse(slow)
    while (right) {
        if (right.val !== left.val) return false
        right = right.next
        left = left.next
    }
    return true
}
var reverse = function (head) {
    let pre = null, current = head
    while (current) {
        let nextNode = current.next
        current.next = pre
        pre = current
        current = nextNode
    }
    return pre
}