234.回文链表
时间:2020-04-20
本文章向大家介绍234.回文链表,主要包括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; }
原文地址:https://www.cnblogs.com/lanpang9661/p/12735976.html
- 曾经做过的40道程序设计课后习题总结(一)
- 基于ODL与Pica8交换机端到端的限速实验
- SpringBoot就是这么简单
- SpringData JPA就是这么简单
- Openflow细节理解之—Buffer_id篇
- 移动商城项目总结
- 移动商城第一篇【搭建项目环境+数据模型】
- 移动商城第二篇(品牌管理模块)【文件上传、数据校验、CRUD】
- 手把手在亚马逊EC2上搭建Keras GPU
- 移动商城第三篇(商品管理)【查询商品、添加商品】
- 移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、后台筛选】
- 移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】
- 移动商城第六篇【单品查询、静态化页面】
- 移动商城第七篇【购物车增删改查、提交订单】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP接入微信H5支付的方法示例
- PHP中用Trait封装单例模式的实现
- laravel 解决Validator使用中出现的问题
- php文件上传原理与实现方法详解
- PHP常见的序列化与反序列化操作实例分析
- Laravel jwt 多表(多用户端)验证隔离的实现
- Laravel实现通过blade模板引擎渲染视图
- Laravel 验证码认证学习记录小结
- ThinkPHP类似AOP思想的参数验证的实现方法
- 解决php扩展安装不生效问题
- 微信小程序发送订阅消息的方法(php 为例)
- Laravel5.5 动态切换多语言的操作方式
- Laravel 实现添加多语言提示信息
- Laravel监听数据库访问,打印SQL的例子
- PHP Swoole异步读取、写入文件操作示例