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

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

示例 1:

输入: 1->2
输出: false

示例 2:

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

进阶:

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

Follow up:

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

解题思路:

首先是寻找链表中间节点,这个可以用快慢指针来解决,快指针速度为2,慢指针速度为1,快指针遍历完链表时,慢指针刚好走到中间节点(相对)。

然后是判断是否是回文链表:

不考虑进阶要求的话,方法千千万。可以把前半部分暂存入新的数组、链表、哈希表等等数据结构,然后依次倒序取出,与后半部分链表每个节点的值对比即可。更简单的是直接用数据结构 - 栈,先进后出,把节点压入栈中,到中间节点后,依次从栈中弹出节点,与后半部分的节点值对比即可。

直接思考进阶要求,在 O(1) 的空间复杂度下,只能选择操作原链表来完成该题。好在这道题只要求返回布尔值,即便把原链表改变了也不用担心。我们可以将链表后半部分 反转,利用迭代法反转链表,时间复杂度为 O(n),空间复杂度为 O(1),所以符合要求。然后从原链表头节点 与 反转后后半部分链表头节点开始对比值即可。

反转链表的各种详细方法在前几日的那道题中已经详细解答过,未看过的朋友可以先看那一篇:LeetCode 206:反转链表 Reverse Linked List

Java:

class Solution {
public boolean isPalindrome(ListNode head) {
ListNode fast = head;
ListNode slow = head;
if (fast == null || fast.next == null) return true;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode newHead = reverseList(slow.next);
while (newHead != null) {
if (head.val != newHead.val) return false;
head = head.next;
newHead = newHead.next;
}
return true;
}
//反转链表函数--详情请看前文
private ListNode reverseList(ListNode head) {
if (head.next == null) return head;
ListNode pre = null;
ListNode tmp;
while (head!= null) {
tmp = head.next;//tmp暂存当前节点的下一个节点
head.next = pre;//当前节点下一个指向pre
pre = head;//刷新pre
head = tmp;//刷新当前节点为tmp
}
return pre;
}
}

Python:

class Solution:
def isPalindrome(self, head: ListNode) -> bool:
fast, slow = head, head
if not fast or not fast.next: return True
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
newHead = self.reverseList(slow.next)
while newHead:
if newHead.val != head.val: return False
newHead = newHead.next
head = head.next
return True def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
pre, tmp = None, None
while (head):
tmp = head.next
head.next = pre
pre = head
head = tmp
return pre

欢迎关注公.众号一起学习: 爱写Bug

LeetCode 234:回文链表 Palindrome Linked List的更多相关文章

  1. leetcode 234 回文链表 Palindrome Linked List

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

  2. Java实现 LeetCode 234 回文链表

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

  3. [Swift]LeetCode234. 回文链表 | Palindrome Linked List

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

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

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

  5. 回文链表 · Palindrome Linked List

    [抄题]: 设计一种方式检查一个链表是否为回文链表.1->2->1 就是一个回文链表. [暴力解法]: 时间分析: 空间分析: [思维问题]: 以为要从从后往前扫描,不知道调用revers ...

  6. LeetCode 234——回文链表

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

  7. [LeetCode] 234. 回文链表 ☆(翻转链表)

    描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true 进阶:你能否用 O(n) 时间复杂 ...

  8. LeetCode 234. 回文链表

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

  9. Leetcode:234 回文链表

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

随机推荐

  1. 节点List相关操作

    为方便遍历子节点,lxml将节点list的操作尽可能的与python处理list的方式一样保持一致 创建XML from lxml import etree root = etree.Element( ...

  2. Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤.不过必须注意:要忽 ...

  3. ubuntu通过代理设置update源

    ubuntu更换国内源 备份/etc/apt/sources.list文件 cp /etc/apt/sources.list /etc/apt/sourses.list.backup #163源deb ...

  4. C# windows服务,解决应用程序开机自启问题

    最近在东营做一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的winform应用程序,有一个问题就是服务器重启后,必须登录服务器操作系统,手动启动才行,于是 ...

  5. bootstrap 输入框后面有个按钮

    效果如下:  实现代码:

  6. python-3.8.0 新特性之赋值表达式

    [python-3.8.0 新特性之赋值表达式] 赋值表达式的语法是这样的“ name := expression ”,形式上看和赋值语句 “ = ” 差不多,就作用上来看也雷同.也就是说 “:=” ...

  7. idea整合svn

    如果遇到找不到svn.exe的情况.可以重新运行svn的安装程序.勾选上svn的安装.

  8. django1-web开发基础知识

    1.http概述 当前版本:1.1 http协议是一个客户端和服务端请求应答的标准TCP,如浏览器作为客户端发送请求到服务器指定端口 ,服务器将内容返回给服务器 2.协议格式 http定义了客户端与服 ...

  9. jquery-uploadfile的使用(多文件异步上传)

    需求 在页面端可以在页面不刷新情况下上传多个有大小限制的word文件,并返回文件保存的路径,同时可以删除误上传的文件. 准备 下载该插件 该插件依赖jquery1.9.1版本(其它不清楚)*在jsp页 ...

  10. linux下配置jdk,tomcat,mysql,redis,zookeeper

    jdk: 解压: tar zxvf jdk-8u144-linux-x64.tar.gz 执行:vi /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0 ...