234. Palindrome Linked List
题目简介
/**
* @param {ListNode} head
* @return {boolean}
*/
题目给我们一个链表头 head
要求我们判断该链表是否能构成回文
解题思路
这题有很多种解决方法,但是如果要用到 O(1) 的空间复杂度,我们需要一些额外的操作
整体思路如下:
- 我们找到链表中的中间节点
- 把中间节点后的链表翻转
- 从原来链表的两侧向中间比较节点元素
Javascript
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
// 1. find the middle node
let fast = head
let slow = head
while(fast && fast.next) {
fast = fast.next.next
slow = slow.next
}
// 2. reverse the second half of the list
let prev = null
let cur = slow
while(cur) {
let next = cur.next
cur.next = prev
prev = cur
cur = next
}
// 3. compare 2 list
let first = head
let second = prev
while(second) {
if(first.val !== second.val) {
return false
}
first = first.next
second = second.next
}
return true
};