回文链表-leetcode(234)
回文链表 回文链表-LeetCode(234)
请判断一个链表是否为回文链表
方法一
- 链表的值转换到数组中
- 将数组均分成俩个小数组
- 逆序其中一个数组,然后比较俩个数组对应下标的值是否相同
var isPalindrome = function(head) { var arr = [] while (head) { arr.push(head.val) head = head.next } var len = arr.length var m = arr.length / 2 var a1 = arr.splice(m) if (len % 2) { // 若数组长度为奇数,去除中间的数 a1.shift() } return arr.reverse().join() === a1.join() }
方法二
- 使用快慢指针找到链表中间的节点
- 把后半部分节点的值放入栈中
- 依次出栈,从头节点开始比较,直到栈为空或者值不相同
var isPalindrome = function (head) { var fast = head var slow = head var p = head if (!head || !head.next) { // 若链表为空或只有一个节点,则直接返回true return true } while (fast.next && fast.next.next) { fast = fast.next.next slow = slow.next } var stack = [] slow = slow.next while (slow) { stack.push(slow.val) slow = slow.next } while (stack.length) { var n = stack.pop() if (n !== p.val) { return false } p = p.next } return true }