7.Palindrome Linked List(回文链表)
Level:
 Easy
题目描述:
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
思路分析:
 由题意知,我们要判断一个链表是不是回文结构,并且时间复杂度为O(n),额外的空间复杂度为O(1)。那么我们只能在原地进行判断,我们可以将链表分成左右两部分,然后将右部分链表进行原地反转,反转完成后我们分别从最左端和最右段开始遍历链表,并且实时判断左右两部分链表对应的节点值是否相等,如果不等那就返回false,如果遍历能够走到最后,那么就返回true。这样可以在满足题目要求的情况下,求出问题的解。
代码:
/**
 * 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)
            return true;
        if(head.next==null)
            return true;
        ListNode n1=head;
        ListNode n2=head;
        //设置一个满指针和一个快指针,找到链表的中间节点,用来将链表化为左右两部分
        while(n1.next!=null&&n1.next.next!=null){
            n1=n1.next.next;
            n2=n2.next;
        }
        n2=n1.next; //右部分
        n1.next=null //左右断开
        ListNode n3=null;
        while(n2!=null){//反转右部分链表
            n3=n2.next;
            n2.next=n1;
            n1=n2;
            n2=n3;
        }
        n3=n1;//保存最右的节点,以便最后回复链表的结构
        n2=head;
        while(n1!=null&&n2!=null){//判断链表是否为回文结构
            if(n1.val!=n2.val)
                return false;
            n1=n1.next;
            n2=n2.next;
        }
        n1=n3.next;
        n3.next=null;
        while(n1!=null){//恢复链表结构
            n2=n1.next;
            n1.next=n3;
            n3=n1;
            n1=n2;
        }
        return true;
    }
}
7.Palindrome Linked List(回文链表)的更多相关文章
- [CareerCup] 2.7 Palindrome Linked List 回文链表
		2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome ... 
- [LeetCode] Palindrome Linked List 回文链表
		Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ... 
- [LeetCode] 234. Palindrome Linked List 回文链表
		Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ... 
- lintcode 中等题:Palindrome Linked List 回文链表
		题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ... 
- 234 Palindrome Linked List 回文链表
		请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 详见:https://leetcode.com/problems/palindrome-linked- ... 
- [Swift]LeetCode234. 回文链表 | Palindrome Linked List
		Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ... 
- LeetCode OJ:Palindrome Linked List(回文链表判断)
		Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ... 
- LeetCode 234:回文链表 Palindrome Linked List
		 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ... 
- 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
		题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案 ... 
- 回文链表 · Palindrome Linked List
		[抄题]: 设计一种方式检查一个链表是否为回文链表.1->2->1 就是一个回文链表. [暴力解法]: 时间分析: 空间分析: [思维问题]: 以为要从从后往前扫描,不知道调用revers ... 
随机推荐
- 将chrome浏览器的默认背景颜色修改为浅绿色,以减缓长时间看电脑的眼睛不舒服的问题
			修改chrome文件夹中的Custom.css, 此文件里面默认内容是空的. 在其中添加下面这段代码: 你也可以选择自己的喜欢的颜色, 前提是你知道你想要更改的颜色的十六进制颜色值, 例如:#CCEB ... 
- 2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索
			表达式 语法 说明 任一字符 . 匹配除换行符外的任何一个字符. 最多 0 项或更多 * 匹配前面表达式的 0 个或更多搜索项. 最多一项或更多 + 匹配前面表达式的至少一个搜索项. 最少 0 项或更 ... 
- 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)
			C# Console类的具体用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-08 这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下 Console.Wr ... 
- Vue基础汇总
			1)双向绑定: <div id="app"> <p>{{message}}</p> <input v-model="messag ... 
- Windows安装memcached图文教程(转)
			一.下载Memercached For Windows 二.安装步骤 1.解压到指定目录,如:C:\Memcached\memcached-win32-1.4.4-14. 2.用cmd打开命令窗口,转 ... 
- koa1链接mongodb
			1.项目下安装mongodb和mongoose npm install mongodb --save-dev npm install mongoose --save-dev 2.router中 var ... 
- C++面向对象类的实例题目五
			题目描述: 编写一个程序,采用一个类求n!,并输出5!的值. 程序代码: #include<iostream> using namespace std; class CFactorial ... 
- Python 求和函数
			#coding=utf-8 ########################### #求1到10,20到30,30到40之和 ########################### sum=0 for ... 
- Zbar -- 源码分析
			博客转载自:https://blog.csdn.net/sunflower_boy/article/details/50783179 //Img_scanner.c 文件内 int zbar_scan ... 
- Person的delete请求--------详细过程
			首先,数据库的增删改查都是在PersonRepository中实现,因此,直接进入PersonRepository,找到其父类,搜索delete. @Override @TransactionalMe ... 
