首页 > 其他分享 >leetcode 234. 回文链表 js 实现

leetcode 234. 回文链表 js 实现

时间:2022-10-27 14:35:44浏览次数:76  
标签:head return next 链表 let 234 js 节点

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

 

示例 1:


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


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

提示:

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

链接:https://leetcode.cn/problems/palindrome-linked-list

/**
 * 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 {boolean}
 */
//  方法一:快慢指针+反转链表法
// 1. 找到后半部分链表的头结点,即先找到前半部分的尾结点,如果链表节点数为奇数,则中间的节点算做前半段
// 2. 反转后半段链表
// 3. while 循环,遍历,遍历条件为短的链表先遍历结束
// 4. 前后两段链表值对比,当不相等则返回 false,否则返回 true
// 5. 将链表恢复原样,避免其他地方使用
// 复杂度分析
// 时间复杂度:O(n),其中 n 指的是链表的大小。
// 空间复杂度:O(1),我们只会修改原本链表中节点的指向,而在堆栈上的堆栈帧不超过 O(1)O(1)。
var isPalindrome = function(head) {
    if(head === null){
        return true;
    }
    // 获取前半部分链表的尾结点
    let fistHalfEnd = getFistHalfOfLinked(head);
    // 反转后半部分链表
    let secondLinked = reverseList(fistHalfEnd.next);
    // 复制头结点,以便接下来遍历
    let p1 = head;
    // 复制后半部分链表,用来遍历
    let p2 = secondLinked;
    // 定义默认返回的结果
    let result = true;
    // 当后半部分链表还存在时,进行遍历
    while(p2){
        if(p1.val !== p2.val){
            result = false;
            break;
        }
        p1 = p1.next;
        p2 = p2.next;
    }
    // 恢复链表,再次反转后半段
    fistHalfEnd.next = reverseList(secondLinked)
    return result;
};
// 反转链表
function reverseList(head){
    if(!head || !head.next){
        return head
    }
    // 定义当前节点 等于 head
    let cur = head;
    // 定义上一个节点 等于 null
    let prev = null;
    // 如果当前节点存在,在进行链表遍历
    while(cur){
        // 存储当前节点的下一个,因为一会要存为上一个
        let temp = cur.next;
        // 改变当前节点的下一个节点的指向为上一个
        cur.next = prev;
        // 向前推进一步,上一个节点变为当前节点
        prev = cur;
        // 当前节点变为原来当前节点的下一个节点
        cur = temp;
    }
    // 返回反转后的头节点
    return prev;
}

// 链表分两半,返回前半部分的链表的尾结点
// 使用快慢指针
function getFistHalfOfLinked(head){
    let fast = slow = head;
    while(fast.next && fast.next.next){
        fast = fast.next.next;
        slow = slow.next;
    }
    return slow;
}
// 方法二:数组法
// 复杂度分析
// 时间复杂度:O(n),其中 n 指的是链表的元素个数。
// 第一步:遍历链表并将值复制到数组中,O(n)。
// 第二步:双指针判断是否为回文,执行了 O(n/2) 次的判断,即 O(n)。
// 总的时间复杂度:O(2n) = O(n)。
// 空间复杂度:O(n),其中 n 指的是链表的元素个数,我们使用了一个数组列表存放链表的元素值。
var isPalindrome = function(head) {
    if(!head || !head.next){
        return true
    }
    let arr = [];
    while(head){
        arr.push(head.val)
        head = head.next;
    }
    let len = arr.length;
    for(let i=0,j=len-1;i<len,j>0;i++,j--){
        if(arr[i] !== arr[j]){
            return false;
        }
    }
    return true;
}

执行用时:

看执行用时,方法一的内存消耗和用时略好于方法二。

参考链接:https://leetcode.cn/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/

 

标签:head,return,next,链表,let,234,js,节点
From: https://www.cnblogs.com/beileixinqing/p/16832125.html

相关文章

  • js缓动动画
      //缓动动画 //封装缓动动画函数传递两个参数需要执行动画的对象和目标位置 functionanimate(obj,target){      //先把原先的定时器清除,只......
  • postman 模拟json发送数据
    https://www.onlinedown.net/article/10021411.htm  在地址栏里输入请求:127.0.0.1:8081/getmoney      选择“POST”方式。      在“headers”添加ke......
  • js获取时间文件的封装
    /**年(Y)可用1-4个占位符*月(m)、日(d)、小时(H)、分(M)、秒(S)可用1-2个占位符*星期(W)可用1-3个占位符*季度(q为阿拉伯数字,Q为中文数字)可用1或4个占位符......
  • Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)
    文章目录​​写在前面​​​​流程分析​​写在前面关于TemplatesImpl加载字节码就不多说了,之前也写过自己翻一翻,或者网上看看其他大佬的,至于为什么选择这一个,因为这里面大......
  • 【JS】对象属性标志和属性描述符
    1.对象属性对象属性分为两种:数据属性访问器属性2.对象数据属性标志属性标志有4个:value、writable、enumberable、configurablevalue:  即属性值writable: ......
  • 【JSON】Python读取JSON文件报错json.decoder.JSONDecodeError的问题
    报错json.decoder.JSONDecodeError:Expectingpropertynameenclosedindoublequotes:line*column*(char*)解决百度到了多种情况:编码使用UTF-8键值用双引......
  • 数据结构 玩转数据结构 4-1 什么是链表
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13429 1重点关注1.1什么是链表数据存在节点中的一种线性数据结构  1.2......
  • leetcode 206. 反转链表 js实现
    给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出......
  • js async await
    async函数一定会返回一个promise对象。如果一个async函数的返回值看起来不是promise,那么它将会被隐式地包装在一个promise中。如asyncfunctionfoo(){retur......
  • Node.JS 安装(Windows 和 Linux )
    1、Linux版采用YUM方式安装。1.1、卸载旧版本查看旧版本:rpm-qa|grepnodejs卸载:卸载过程中输入y确认yumremovenodejs1.2、安装1.2.1、Hint官......