leetcode-链表-234-回文链表

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

今天讲解的是链表系列的1道题:

  1. 回文链表

234. 回文链表

leetcode地址:leetcode.cn/problems/pa…

难度

简单

描述

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

 

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

 

提示:

链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9

解法1

1.采用将链表转成数组的方法,然后使用指针对撞来判断是否时回文数组,也就是是否是回文链表

2.首先将链表转成数组,定义变量arr,来存储链表中的每个值

3.变量链表,当head一直存在的时候,将 每个链表的值添加到arr中,同时将head移动到下一个节点

4.定义左指针 l,初始值是0

5.定义右指针,初始值指向数组最后一位

6.判断左指针指向的值和右指针指向的值是否相等

7.如果两个值不相等,则表明不是回文,直接返回false

8.如果两个值相等,则继续遍历判断,也就是将左指针向右移动一位,将右指针向左移动一位

9.最后遍历完,一直相等,则表明是回文,直接返回true

解法2

整个流程可以分为以下五个步骤:

  1. 找到前半部分链表的尾节点。
  2. 反转后半部分链表。
  3. 判断是否回文。
  4. 恢复链表。
  5. 返回结果

下面采用解法1来实现下这道算法题

代码

/*
 * @lc app=leetcode.cn id=234 lang=javascript
 *
 * [234] 回文链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */

var isPalindrome = function(head) {
    let arr = [];
    while(head){
        arr.push(head.val)
        head = head.next;
    }

    let l = 0;
    let r = arr.length - 1;
    while(l < r){
        if(arr[l] !== arr[r]){
            return false
        }
        l++
        r--
    }
    return true
};
// @lc code=end