LeetCode 234 回文表

题目

请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false

示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路

  1. 利用双指针找到链表的中间位置
    每一次慢指针移动一步,快指针移动两步,当快指针遍历到链表最后的时候,慢指针正好指向链表中间节点
  2. 将后半部分链表反转
  3. 反转后,遍历比较前半段和后半段链表,主要终止条件

代码

class Solution(object):
    def isPalindrome(self, head):
        if head == None or head.next == None:
            return True
        slow = head
        fast = head
        while fast and fast.next: # 注意终止条件
            slow = slow.next
            fast = fast.next.next

        mid = slow # 找到链表的中间节点
        new_head = None
        while mid: # 将后半段链表反转
            nxt = mid.next
            mid.next = new_head
            new_head.next = mid
            mid = nxt

        while head != slow: # 判断是否是回文表
            if head.val == new_head.val:
                head = head.next
                new_head = new_head.next
            else:
                return False
        return True
    

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 链表删除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷阅读 6,364评论 4 35
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,497评论 1 3
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,879评论 0 2
  • (一)LeetCode206.反转链表 题目描述: 反转一个单链表。 代码实现 (二)LeetCode160. 相...
    Jarily阅读 1,429评论 0 5
  • 每次上完张校的课后就感觉心变得很平静,轻松,愉悦。似乎突然学到了很多,可又具体不到一个点上。只有在平时沟通时下...
    一一妈2011阅读 179评论 0 0