回文链表的判断
一.前言
先复习一下之前的知识。
寻找回文串的核心思想是从中心向两边扩展:
String pal(String s,int l,int r){
while(l>=0&& r<s.length()&& s.charAt(l)==s.charAt(r))
{
l--;
r++;
}
return s.subString(l+1,r);
}
判断一个字符串是不是回文串就简单了,不需要考虑奇偶情况,只需要双指针技巧,从两端向中间逼近:
bool isPalindrome(string s) {
int left = 0, right = s.length - 1;
while (left < right) {
if (s[left] != s[right])
return false;
left++; right--;
}
return true;
}
二.判断回文单链表
这道题的难点在于单链表无法倒着遍历,无法使用双指针技巧。最简单的办法就是把原始链表反着存入一条新的链表,然后比较这两条链表是否相同,如何反转链表,前面的文章“k个一组反转链表”有介绍。
其实,借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表。
/* 倒序打印单链表中的元素值 */
void traverse(ListNode head) {
if (head == null) return;
traverse(head.next);
// 后序遍历代码
print(head.val);
}
稍作修改,模仿双指针实现回文判断功能:
ListNode left;
boolean isPalindrome(ListNode head) {
left = head;
return traverse(head);
}
boolean traverse(ListNode right) {
if (right == null) return true;
boolean res = traverse(right.next);
// 后序遍历代码
res = res && (right.val == left.val);
left = left.next;
return res;
}
还可以利用双指针技巧等方法,优化空间复杂度。