请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
参考答案
方案一
利用链表的后续遍历,使用函数调用栈作为后序遍历栈,来判断是否回文
var isPalindrome = function(head) { let left = head; function traverse(right) { if (right == null) return true; let res = traverse(right.next); res = res && (right.val === left.val); left = left.next; return res; } return traverse(head); };
方案二
通过快、慢指针找链表中点,然后反转链表,比较两个链表两侧是否相等,来判断是否是回文链表
var isPalindrome = function(head) { // 反转 slower 链表 let right = reverse(findCenter(head)); let left = head; // 开始比较 while (right != null) { if (left.val !== right.val) { return false; } left = left.next; right = right.next; } return true; } function findCenter(head) { let slower = head, faster = head; while (faster && faster.next != null) { slower = slower.next; faster = faster.next.next; } // 如果 faster 不等于 null,说明是奇数个,slower 再移动一格 if (faster != null) { slower = slower.next; } return slower; } function reverse(head) { let prev = null, cur = head, nxt = head; while (cur != null) { nxt = cur.next; cur.next = prev; prev = cur; cur = nxt; } return prev; }
正文结束
Ctrl + Enter