Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

问题:给定一个单向列表结构,判断它是不是回文的。

补充:是否可以在 O(n) 时间,O(1) 额外空间下完成?

解题思路:

对于数组,判断是否是回文很好办,只需要用两个指针,从两端往中间扫一下就可以判定。

对于单向列表,首先想到的是,将列表复制一份到数组中,然后用上面的方法就可以了,O(n) 时间, O(n)额外空间。

如果是 O(1)额外空间,就没有思路,在网上找了下,找到一个解决方案。值得注意的是,这个方案执行过程中,会改变原来列表的结构。

  • 利用快指针、慢指针定位列表的中间元素。快指针每次走两步,而慢指针每次只走一步,当快指针走到列表末尾,慢指针刚好在列表中间。
  • 根据慢指针,将列表前、后两半分开,并将后半列表翻转。
  • 对前半列表 和 翻转后的后半列表依次对比,判断原列表是否是回文的。
 bool isPalindrome(ListNode* head) {

     if(head == NULL || head->next == NULL){
return true;
} if(head->next->next == NULL){
return (head->val == head->next->val);
} if(head->next->next->next == NULL){
return (head->val == head->next->next->val);
} // 找列表中间元素
ListNode* slow = head;
ListNode* fast = head->next; while (slow != NULL && fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
} // 翻转后半部分元素
ListNode* newHead = slow->next;
slow->next = NULL; ListNode* p = newHead->next;
ListNode* pNext = newHead->next->next; newHead->next = NULL;
while (pNext != NULL) {
p->next = newHead;
newHead = p;
p = pNext;
pNext = pNext->next;
} p->next = newHead;
newHead = p; // 判断是否是回文
ListNode* p1 = head;
ListNode* p2 = newHead; while (p2 != NULL) {
if (p1->val != p2->val) {
return false;
}
p1 = p1->next;
p2 = p2->next;
} return true;
}

[LeetCode] 234. Palindrome Linked List 解题思路的更多相关文章

  1. Java [Leetcode 234]Palindrome Linked List

    题目描述: Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) ...

  2. Java for LeetCode 234 Palindrome Linked List

    解题思路: O(1)的空间复杂度,意味着不能通过开一个List来解决问题.我们可以把List分成前后两个部分,后半部分通过指针的相互赋值进行翻转即可. JAVA实现如下: public static ...

  3. 【LeetCode】234. Palindrome Linked List 解题报告(Python)

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

  4. [LeetCode] 234. Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  5. LeetCode 234 Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. 思路: 回文结构从后向前遍历与从前向后遍历的结果是相同的,可以利用一个栈的结构 ...

  6. LeetCode 234. Palindrome Linked List (回文链表)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  7. (easy)LeetCode 234.Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  8. LeetCode 234 Palindrome Linked List(回文链表)(*)(?)

    翻译 给定一个单链表,确定它是否是回文的. 跟进: 你能够在O(n)时间和O(1)空间下完毕它吗? 原文 Given a singly linked list, determine if it is ...

  9. Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法

    1. 问题描写叙述 给定一个单链表,推断其内容是不是回文类型. 比如1–>2–>3–>2–>1.时间和空间复杂都尽量低. 2. 方法与思路 1)比較朴素的算法. 因为给定的数据 ...

随机推荐

  1. 封装一个自己的 Ajax小框架

    框架代码如下: // 使用封装方法的人只关心提供http的请求方法,url地址,数据,成功和失败的回调方法 // 类的构造定义,主要职责就是新建出 XMLHttpRequest 对象 var MyXM ...

  2. 菜鸟的MySQL学习笔记(五)

    7.自定义函数 用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同.包含了两个必要条件,参数与返回值.没有必然内在联系. 函数可以返 ...

  3. WinForm TreeView 三种状态

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { var node = e.N ...

  4. 强大的字符串格式化函数 - format

    自python2.6开始,新增了一种格式化字符串的函数str.format(),它通过{}和:来代替% 位置方法格式化 >>>'{}-{}'.format('simon','ting ...

  5. 在Windows下不使用密码远程登陆Linux

    在登陆Linux进行管理的时候我们通常会使用用户名和密码进行登陆,这样一来是比较麻烦,二来是不安全,为了解决这个问题,我们可以使用公私钥 (public keys和private keys)进行认证. ...

  6. art.dialog 与 ajax 异步请求

    上周写了一些代码,涉及到jquery异步请求,这里归纳总结下,希望对刚接触编程的同学有帮助. 主要习惯使用 art.dialog 框架,非常好用,在异步请求上,它提供了很多简便的方法. 加载使用art ...

  7. python【第十九篇】Django进阶

    1.路由系统优化 1.1 路由分发 前面我们已经知道,在工程名下的urls.py中写我们的路由映射关系,那么问题来了,假设我们有10个app,如果把所有的url映射都写在urls.py文件中,那么每一 ...

  8. lucene 实现word,pdf全文检索源码

    创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...

  9. 2014年度辛星html教程夏季版第一节

    从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...

  10. 如何利用C生成.so供Mono调用

    Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发.但在Linux世界中C语言依然是 主流.很多时候一些关键应用(比如大型 笛卡儿 乘积运算.需要调用平台硬件功 ...