- 分析
这道题的难点在于,单链表无法倒着遍历,无法使用双指针技巧。容易想到的思路就是把原始链表反转存入一条新的链表,然后比较这两条链表是否相同。**其实也可以借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表。**因为链表也兼具这样的递归结构,链表其实也可以有前序遍历和后序遍历。
void traverse(ListNode* head){
if(head == nullptr) return;
traverse(head -> next);
cout << head -> val << endl;
}
其实在这个基础上改进一下,就可以达到要求。
- 代码
//左侧指针
ListNode* left;
bool isPalindrome(ListNode* head) {
left = head;
return traverse(head);
}
bool traverse(ListNode* right){
if(right == nullptr) return true;
bool res = traverse(right -> next);
//后序遍历
res = res && (left -> val == right -> val);
left = left -> next;
return res;
}