描述

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

示例 1:

输入: 1->2
输出: false
示例 2:

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

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

解析

回文的意思,比如 1->2->2->1是回文链表;1->2->3->2->1也是。要满足上面的时间、空间复杂度,需要翻转前半部分的链表,与后半部分的链表比较。

步骤:

1. 找出中间节点;

2.翻转前半部分节点;

3.与后半部分节点一一比较。

优化点:

将步骤1、2合并,边找中间节点边翻转。

代码

例子:

1 2 3 4
slow = 2 fast = 3
slow = 3 fast = null pre=2

1 2 3 4 5
slow = 2 fast = 3
slow = 3 fast = 5 pre=2

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution { //优化写法,将遍历、翻转同时进行
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode last = null;
ListNode pre = head;
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next; pre.next = last;
last = pre;
} ListNode rightStart;
if (fast == null) {//说明偶数节点
rightStart = slow;
} else {
rightStart = slow.next;
} ListNode leftStart = pre;
while (leftStart != null && rightStart != null) {
if (leftStart.val != rightStart.val) {
return false;
}
leftStart = leftStart.next;
rightStart = rightStart.next;
}
if (leftStart != null || rightStart != null) {
return false;
}
return true;
}

//正常思路,一步一步来
public boolean isPalindrome1(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode pre = head;
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {//找中间节点
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
ListNode rightStart;
if (fast == null) {//说明偶数节点
rightStart = slow;
} else {
rightStart = slow.next;
} ListNode leftStart = reserver(head);//翻转前半部分链表
while (leftStart != null && rightStart != null) {//一一比较
if (leftStart.val != rightStart.val) {
return false;
}
leftStart = leftStart.next;
rightStart = rightStart.next;
}
if (leftStart != null || rightStart != null) {
return false;
}
return true;
}
//翻转链表
public ListNode reserver(ListNode head) {
if (head == null) {
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode next;
while (cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}

[LeetCode] 234. 回文链表 ☆(翻转链表)的更多相关文章

  1. Java实现 LeetCode 234 回文链表

    234. 回文链表 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否 ...

  2. Leetcode 234. 回文链表(进阶)

    1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...

  3. leetcode 234 回文链表 Palindrome Linked List

    要求用O(n)时间,和O(1)空间,因此思路是用本身链表进行判断,既然考虑回文,本方法思想是先遍历一次求链表长度,然后翻转前半部分链表:然后同时对前半部分链表和后半部分链表遍历,来判断对应节点的值是否 ...

  4. LeetCode 234——回文链表

    1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O( ...

  5. LeetCode 234. 回文链表

    class Solution { public: bool isPalindrome(ListNode* head) { deque<int> d1, d2; ListNode* p = ...

  6. Leetcode:234 回文链表

    leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...

  7. [链表]LeetCode 25 K组一个翻转链表

    LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...

  8. leetcode 1.回文数-(easy)

    2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...

  9. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

随机推荐

  1. vs Qt mysql 打包程序 Driver not loaded Driver not loaded

    vs下开发Qt连接mysql程序,开发过程中操作MySQL没有问题,但打包以后安装在别的电脑上发现竟然无法连接MySQL,打包的时候,所需的libmysql.dll等dll文件拷贝到exe同级目录了, ...

  2. VPB编译日志1

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake ...

  3. vs webapi 取消controller

    1.添加引用 using Panda.DynamicWebApi; 2.starup.cs public void ConfigureServices(IServiceCollection servi ...

  4. MyBatis的学习总结:调用存储过程【参考】

    一.创建存储过程 存储过程的目的:统计edi_test_task 正在运行的任务和非运行的任务 CREATE DEFINER=`root`@`%` PROCEDURE `edihelper`.`SP_ ...

  5. Windows下MariaDB数据库安装图文教程

    MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQL数据库可以迁移到MariaDB中使用   说明: MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQ ...

  6. 123457123456#2#----com.MC.DishuGame368----前拼后广--儿童打地鼠Game-mc2222222

    com.MC.DishuGame368----前拼后广--儿童打地鼠Game-mc

  7. Python - Django - ORM 自定义 char 类型字段

    用 CharField 定义的字段在数据库中存放为 verchar 类型 自定义 char 类型字段需要下面的代码: class FixedCharField(models.Field): " ...

  8. 单机prometheus vs 集群kube-prometheus+prometheus-operator

    prometheus 组件: node-exporter:9100端口 https://segmentfault.com/a/1190000017959127

  9. BASH输出着色显示

    通过将其输出着色,可以使BASH脚本更漂亮.使用ANSI转义序列设置文本属性,例如前景色和背景色. 使用以下模板格式来编写彩色文本: echo -e "\e[前景色值;背景色值;2m文本\e ...

  10. R Multiple Plots

    R Multiple Plots In this article, you will learn to use par() function to put multiple graphs in a s ...