• 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;
    }



  • 相关阅读:
    bzoj3159: 决战
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) C
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) B
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) A
    loj 6401 字符串
    BZOJ5194 雪地靴
    BZOJ 4709 柠檬
    BZOJ 3343 魔法
    [8月16日绍兴]试剂
    设备塔
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12735976.html
Copyright © 2020-2023  润新知