LeetCode题解:234.回文链表

回文链表

一、LeetCode题解

瞧一瞧~
  • 博健的LeetCode题解:Gitbook版本传送门
  • 博健的LeetCode题解:CSDN传送门
  • 前端进阶笔记:Gitbook传送门

二、算法题

题目

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

解法一(快慢指针+反转链表)

思路
  • 利用快慢指针确定链表的中间位置;
  • 将链表的前半部分进行反转,与链表的后半部分进行比对;
代码
var isPalindrome = function(head) {
    if(!head || !head.next) return true;
    var slow = head // 慢指针
    var fast = head // 快指针
    var prev = null // 保存上一个节点
    var temp = null // 保存下一个节点
    while(fast && fast.next){
        fast = fast.next.next // 快指针走2个节点

        temp = slow.next // 慢指针走过得链表直接反转
        slow.next = prev
        prev = slow

        slow = temp // 慢指针走1个节点
    }
    if(fast){ // 奇数个节点的链表
        slow = slow.next
    }
    while(slow){
        if(slow.val !== prev.val) return false;

        slow = slow.next
        prev = prev.next
    }
    return true
};
结果

LeetCode题解:234.回文链表_第1张图片

解法二(辅助数组+双指针)

思路
  • 将链表数据转换成数字;
  • 双指针,一个在头,一个在尾对应比较;
代码
var isPalindrome = function(head) {
    if(!head || !head.next) return true; //边界判断
    var arr = []
    while(head){
        arr.push(head.val)
        head = head.next
    } //获取节点数组
    var left = 0, right = arr.length-1
    while(left < right){
        if(arr[left] !== arr[right]) return false
        left++
        right--
    }
    return true
};
结果

LeetCode题解:234.回文链表_第2张图片

你可能感兴趣的:(#,LeetCode题解系列)