力扣 234. 回文链表

news2024/9/20 8:56:07

力扣 234. 回文链表

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

示例 1:

img

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

示例 2:

img

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

提示:

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

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

两种解法

  • 将链表值存储到数组中,数组双指针判断
  • 找到链表中间结点(快慢指针),反转链表后半段(迭代),然后比较

数组双指针

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)

这个解法算是思路简单,而且时间复杂夫和空间复杂度相对也还可以

/**
 * 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}
 */
var isPalindrome = function(head) {
    let list = [];
    while(head != null) {
        list.push(head.val);
        head = head.next;
    }
    for(let i = 0, j = list.length - 1; i <= j; i++, j--) {
        if(list[i] != list[j])
            return false;
    }
    return true;
};

反转后半段链表比较

  • 时间复杂度 O(n)
  • 空间复杂度 O(1)

这个解法我感觉挺好的,主要就是有两个点吧:

找到中间结点:快慢指针,快指针每次跳两个结点, 慢指针一次跳一个结点,注意兼容链表奇偶个数

反转链表:考虑到性能优化, 用迭代算法反转以减小空间复杂度

/**
 * 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}
 */

var reverseList = function(head) {
    // 迭代反转链表
    if(head == null || head.next == null) {
        return head;
    }
    let pre = null, cur = head;
    while(cur != null) {
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}

var midNode = function(head) {
    let front = head;
    let slow = head;
    while(front.next != null && front.next.next != null) {
        front = front.next.next;
        slow = slow.next;
    }
    return slow;
}

var isPalindrome = function(head) {
    // 快慢指针确定中间结点,反转后半段链表比较
    if(head.next == null) {
        return true;
    }
    let mid = midNode(head);
    let endlist = reverseList(mid.next);
    let n = head;
    let scendn = endlist;
    while(scendn != null) {
        if(n.val != scendn.val) {
            return false;
        }
        scendn = scendn.next;
        n = n.next;
    }
    return true;
};

仅供参考,欢迎交流学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速排序算法 QuickSort algorithm

该算法是托尼霍尔在1960年提出。 算法思想&#xff1a;从集合中随机取一个数作为支点&#xff0c;然后将比它大的数放在一个集合里&#xff0c;比它小的数放在另一个集合中&#xff0c;然后再递归下去&#xff0c;最后便可求得有序的数组。 QuickSort(A) 1: S− {}; S {}; …

LeetCode栈和队列练习

文章目录前言1.力扣20. 有效的括号1.题目分析2.代码示现2.力扣225. 用队列实现栈1.题目分析2.代码实现3.力扣232. 用栈实现队列1.题目分析2.代码实现4.力扣622. 设计循环队列1.题目分析2.代码实现5.总结前言 之前的博客介绍的栈和队列的实现&#xff0c;本文将会对栈和队列的使…

Unity - Shader - Projector 高空云层底下透明阴影

Semitransparent Shadow - Alpha Test SoftShadow 这种方式我最早是在 cat like coding 博主的文章看到的&#xff0c;这种方式我自己亲自测试过 缺点&#xff1a;会有阴影抖动严重的现象 &#xff08;其中的 dithering tex 可以参考我之前写的&#xff1a;Unity - 手动创建…

【图神经网络论文整理】(六)—— Universal Graph Transformer Self-Attention Networks

Dai Quoc Nguyen, Tu Dinh Nguyen, Dinh PhungThe ACM Web Conference 2022 (WWW 22)Computer Vision and Pattern Recognition论文地址 本文介绍的论文是《Universal Graph Transformer Self-Attention Networks》。 该篇文章的主要贡献是将Transformer应用在GNN中用于学习图…

Java Spring Bean的实例化

Java Spring Bean的实例化 Spring框架支持两种方式去进行Bean的管理&#xff1a;BeanFactory、ApplicationContext BeanFactory&#xff1a;pom文件引入spring-context坐标&#xff0c;创建对应的待IOC类&#xff0c;然后在bean.xml注入&#xff0c;最后在调用处初始化BeanFa…

【数据结构】树与二叉树

目录 树的定义 二叉树的定义 二叉树的性质 满二叉树 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 遍历二叉树&#xff08;递归&#xff09; 二叉树的层次遍历 先序创建二叉树 复制二叉树 销毁二叉树 写在最后 树的定义 树是n个结点的有限集&#xf…

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

微信小程序中生成普通二维码&#xff0c;并根据二维码里的参数跳转对应的页面1.打开[微信公众平台](https://mp.weixin.qq.com/)使用encodeURIComponent()对参数进行转码第一步&#xff1a;对要传递的参数进行编码第二步&#xff1a;生成二维码第三步&#xff1a;小程序中转页面…

电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道

随着5G、汽车电子、物联网等新兴产业的发展&#xff0c;促进了相关电子元器件的市场需求快速增长。根据工信部预计&#xff0c;2023年我国电子元器件销售总额将达到2.1万亿元。而在互联网高速发展的今天&#xff0c;电子元器件交易在线化是必然趋势&#xff0c;B2B电子元器件线…

maven学习:引入

你是否早已厌倦了日复一日的手工构建工作&#xff1f;你是否对各个项目风格迥异的构建系统感到恐惧&#xff1f;Maven——Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。这一Java社…

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。 假设要预测其中一个变量。比如&#xff0c;sparkling wine。如何建立一个模型来进行预测呢&#xff1f; 一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以…

【从零开始学微服务】04.微服务架构的特点

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点&#xff1a; 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作&#xff0c;但是操作过于繁琐&#xff0c;于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中&#xff1b;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

VLAN网络支持ipv6的交换机和虚机配置

VLAN支持ipv6的交换机和虚机配置前言一、创建VLAN网络并配置交换机1.规划并在OpenStack上创建 VLAN网络2.在交换机上配置VLAN二、Ubuntu虚机配置1.创建虚机2.在OpenStack上查看port3.登录虚机配置网卡3.1登录虚机后&#xff0c;发现虚机没获取到openstack上对应port的ipv6地址。…

Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

一、前言 视频监控组件经历过数十年的迭代&#xff0c;从最初的只简单播放个rtsp视频流&#xff0c;到现在支持各种音频视频文件格式&#xff08;mp3、wav、mp4、asf、rm、rmvb、mkv等&#xff09;、支持各种视频流格式&#xff08;rtp、rtsp、rtmp、http等&#xff09;、支持…

10个JavaScript常见高级知识点

今天&#xff0c;给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》&#xff0c;主要针对初级前端和想要面试找工作的同学&#xff0c;想要学好前端&#xff0c;除了要掌握JavaScript的基础知识外&#xff0c;还需要掌握一些高级的知识点。 学会了下面这些常见的高…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS(Database Management System-数据库管理系统)&#xff0c;为这个业务系…