234.回文链表
2020-04-20
回文链表
请判断一个链表是否为回文链表。
题解:
思路1:数组记录值+双指针判断
var isPalindrome = function (head) { if (!head) return true; let valArr = []; let fn = (node) => { valArr.push(node.val); if (node.next) { fn(node.next); } } fn(head); let i = 0, j = valArr.length - 1; while (i < j) { if (valArr[i] !== valArr[j]) return false; i++; j--; } return true; };
思路2:快慢双指针翻转前半链表
// 注意: // 奇数偶数的情况略有不同,奇数情况下,在判断值是否相同时 head 要往后走一位。 // 例如: // 奇数:1 -> 2 -> 3 -> 2 -> 1 // 遍历完成后:head = 3 -> 2 -> 1 // reversed = 2 -> 1 // 偶数:1 -> 2 -> 2 -> 1 // 遍历完成后:head = 2 -> 1 // reversed = 2 -> 1 var isPalindrome = function (head) { if (head === null || head.next === null) return true; // 若长度为0 或者1 肯定是回文 let pre = null, reversed = null, doubleHead = head; while (doubleHead !== null && doubleHead.next !== null) { pre = head; // pre赋值位当前节点 记录当前节点 head = head.next; // 当前节点进一位 doubleHead = doubleHead.next.next; // double进两位 确保遍历一半结束循环 pre.next = reversed; // 翻转节点 也就是当前节点的next为上一个节点 第一次循环中 没有上一个节点 即null 第二次循环中 上一个节点为第一个节点 reversed = pre; // reversed记录当前节点作为下一次循环的上一个节点 } if (doubleHead) head = head.next; // 如果为奇数,head应该再进一 while (head) { // 遍历翻转链表和原链表的后半部分是否完全相等 if (head.val !== reversed.val) return false; head = head.next; reversed = reversed.next; } return true; }