题目描述
请判断一个链表是否为回文链表。
示例 1:
示例 2:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-linked-list
解题思路
寻找回文串的核心思想是从中心向两端扩展。
因为回文串可能是基数也可能是偶数,长度为奇数时只存在一个中心点,长度为偶数时存在两个中心点。
判断是否为回文串的思路比较简单,不需要考虑奇偶情况,从两端向中心逼近即可。
(因为回文串是对称的,所以正着读和倒着读应该是一样的,这一特点是解决回文串问题的关键)
判断单链表是否为回文链表:
关键单链表无法倒着遍历,无法使用双指针技巧。最简单的办法是把链表反转存入新的链表,比较两者是否一致。
其实,借助二叉树后序遍历的思路,不需要显示反转链表也可以倒叙遍历链表。
链表其实也是可以有前序和后序遍历的
实际上就是把链表节点放入一个栈,然后再拿出来,这时候元素的顺序是反的。
还有更好的思路:
先通过双指针的快慢指针找到链表的中点;
如果fast没指向null说明链表长度为奇数(slow还要再往前一步),否则为偶数;
从slow开始反转后边的链表就可以开始比较回文了。
该方法总体时间复杂度为O(n),空间复杂度为O(1)
解题代码
方法一:
方法二:更好的思路