题目描述:

解题思路:

  判断一个单向链表是否是回文链表,并且要求O(n)的时间复杂度和O(1)的空间复杂度。

  方法有以下几种:

  1、遍历整个链表,将链表每个节点的值记录在数组中,再判断数组是不是一个回文数组,时间复杂度为O(n),但空间复杂度也为O(n),不满足空间复杂度要求。

  2、利用栈先进后出的性质,将链表前半段压入栈中,再逐个弹出与链表后半段比较。时间复杂度O(n),但仍然需要n/2的栈空间,空间复杂度为O(n)。(起初选用了这种方法)

  3、反转链表法,将链表后半段原地翻转,再将前半段、后半段依次比较,判断是否相等,时间复杂度O(n),空间复杂度为O(1)满足题目要求。链表翻转可以参考LeetCode 206 Reverse Linked List的代码。

  第三种方法的核心在于,维护两个指针,慢指针一次移动一个,快指针一次移动两个,这样的结果是,快指针到达末尾时,慢指针到达中间。

  模拟如下图:

Java代码:

 //public class LeetCode234为测试代码
public class LeetCode234{
public static void main(String[] args) {
ListNode n1=new ListNode(1),n2=new ListNode(2),n3=new ListNode(4),n4=new ListNode(2),n5=new ListNode(1);
ListNode head=n1;
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
System.out.print("链表"+n1.val+"->"+n2.val+"->"+n3.val+"->"+n4.val+"->"+n5.val+"是否是回文链表:");
System.out.println(new Solution().isPalindrome(head));
}
}
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow=head,fast=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;//慢指针一次移动一个结点
fast=fast.next.next;//快指针一次移动两个结点
}
if(fast!=null)//结点个奇数为时会出现fast!=null,此时将slow右移一个
slow=slow.next;
slow=reverse(slow);
ListNode h=head;//定义h是为了不破坏原来链表
while(slow!=null){
if(h.val!=slow.val)
return false;
h=h.next;
slow=slow.next;
}
return true;
}
//reverse为反转链表,详见LeetCode206
public ListNode reverse(ListNode head){
ListNode pre=null;
ListNode current=head;
ListNode next=null;
while(current!=null){
next=current.next;
current.next=pre;
pre=current;
current=next;
}
return pre;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

程序结果:

【LeetCode234】Palindrome Linked List★的更多相关文章

  1. 【LeetCode】链表 linked list(共34题)

    [2]Add Two Numbers (2018年11月30日,第一次review,ko) 两个链表,代表两个整数的逆序,返回一个链表,代表两个整数相加和的逆序. Example: Input: ( ...

  2. 【CF932G】Palindrome Partition(回文树,动态规划)

    [CF932G]Palindrome Partition(回文树,动态规划) 题面 CF 翻译: 给定一个串,把串分为偶数段 假设分为了\(s1,s2,s3....sk\) 求,满足\(s_1=s_k ...

  3. 【CF932G】Palindrome Partition 回文自动机

    [CF932G]Palindrome Partition 题意:给你一个字符串s,问你有多少种方式,可以将s分割成k个子串,设k个子串是$x_1x_2...x_k$,满足$x_1=x_k,x_2=x_ ...

  4. 【题解】Palindrome pairs [Codeforces159D]

    [题解]Palindrome pairs [Codeforces159D] 传送门:\(Palindrome\) \(pairs\) \([CF159D]\) [题目描述] 给定一个长度为 \(N\) ...

  5. 【LeetCode】142. Linked List Cycle II

    Difficulty:medium  More:[目录]LeetCode Java实现 Description Given a linked list, return the node where t ...

  6. 【LeetCode】Palindrome Partitioning 解题报告

    [题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  7. 【LeetCode】817. Linked List Components 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode 234】Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. 思路: 用快慢指针找到链表中点,反转后半部分链表,然后与前半部分进行匹配,随后 ...

  9. 【LeetCode 234_链表】Palindrome Linked List

    ListNode* ReverseList(ListNode *p) { if (p == NULL || p->next == NULL) return p; ListNode *pre = ...

随机推荐

  1. Vue.js之组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. Vue.js组件系统 每一个新技 ...

  2. 如何扩展Linux虚拟内存文件系统

    由于ArcGIS GeoAnalystics Server和Raster Analytics Server大数据分析平台都是基于Spark分析平台的,其部署服务器除了要求具有高内存特点外,也需要确保相 ...

  3. 完美实现Android的屏幕常亮功能

    笔者所在公司做的APP是股票类的,用户在查看股票报价页面的时候,往往需要开启盯盘模式,这个时候屏幕是不能黑屏的,黑屏会导致用户看不到一些关键报价涨跌,错过了买入卖出的最佳时机,就会给用户造成损失,这是 ...

  4. 让 Angular 应用动起来!

    [编者按]本文主要通过生动的实例,介绍为 Angular 应用添加动画的原理与过程.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 我们知道,Angular 应用在更新 DOM 时,会直接将 ...

  5. python 遇到的一些坑

    lst = [1, 2, 4] print lst.__iter__().next() # 打印出来的是 1 print lst.__iter__().next() # 打印出来的是 1 # 调用__ ...

  6. CSS| 颜色名

    CSS 颜色名 所有浏览器都支持的颜色名. HTML 和 CSS 颜色规范中定义了 147 中颜色名(17 种标准颜色加 130 种其他颜色).下面的表格中列出了所有这些颜色,以及它们的十六进制值. ...

  7. INCLUDE COMMON FILES IN HTML USING JQUERY

    Simple example for including common files in HTML. JQuery load() function is used for including comm ...

  8. Unity[C#] Reflection Use

      Reflection Reflection是C#程序员的一个最有力工具 最常用的例子来说明反射的用处是一个插件系统.假设你正在创建一个 接受用户创建 的扩展程序,有没有办法预先知道哪些方法这个扩展 ...

  9. Windows 下的文件被占用问题解决

    windows下,经常容易出现文件被其他程序占用的现象,令人十分头疼.更头疼的是,还看不到被谁占用. 实际上是有办法看到占用的进程的. 话不多说,以Win10为例: 1.打开资源监视器 a.直接程序栏 ...

  10. mysql 错误2203 1061 及安装最后出现2003现象的解决办法

    错误描述 : 1.#2003-服务器没有响应MySQL无法启动 2.Can''t connect to MySQL server on ''localhost'' (10061) 3.ERROR 20 ...