回文链表是指链表中的结点值正着读、反着读结果都是一样的链表。题目要求判断一个单链表是否为回文链表。
判断回文字符串使用双指针法相对容易,但是由于链表不能直接倒序遍历,所以需要另寻他法。
1. 递归法
算法的时间和空间复杂度都是 O(N)。
1.1 思路
由于链表不能直接倒序遍历,所以考虑生成一个原链表的反转链表。
之后遍历原链表与反转链表,对比两个链表是否相同。
相同即为回文链表,不同则不是回文链表。
1.2 代码实现
生成单链表的反转链表,可以参考反转链表。
此处采取一直新的倒序遍历方法,不采用显式反转链表的方法。
下面来介绍一种神奇的链表遍历框架
举个简单例子来说明框架的使用。
如果想要正序打印链表的值,可以将 print 写在前序遍历代码的位置。
如果想要倒序打印链表的值,可以将 print 写在后序遍历代码的位置,如下图所示。
这种框架的本质是: “实际上就是把链表节点放入一个栈,然后再拿出来,这时候元素顺序就是反的,只不过我们利用的是递归函数的堆栈而已。”
下面开始动手实现上述框架。
遍历整个链表,left 为链表的左指针,初始值为head,right为链表的右指针,reverse 最先弹出的 right 是链表的最后一个结点。之后,left 不断向右移动,reverse 函数 return 是否为回文链表的布尔值。
class Solution {
public:
ListNode* left = NULL;
bool isPalindrome(ListNode* head) {
left = head;
return reverse(head);
}
bool reverse(ListNode*