234.回文链表

时间:2020-04-20
本文章向大家介绍234.回文链表,主要包括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;
}



原文地址:https://www.cnblogs.com/lanpang9661/p/12735976.html