力扣打卡:234. 回文链表
解题思路
使用后续遍历进行单链表的逆序遍历
单链表通常使用后序遍历进行逆序的遍历数据节点,后续遍历中的位置是在遍历这个节点后需要完成的事务
模板
//前中后 这样的遍历一般是树(二叉树,左节点右节点)
void traverse(head){
// 链表的前序遍历
traverse(head.left);
// 链表的中序遍历
traverse(head.right);
// 链表的后序遍历
}
void traverse(head){
// 单链表的前序遍历
traverse(head.right);
// 单链表的后序遍历
}
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
ListNode left = null;
public boolean isPalindrome(ListNode head) {
ListNode dummy = new ListNode(); // 虚拟头的设置,虚拟头是为了解决头节点有复杂判断的问题
dummy.next = head;
left = dummy;
return traverse(head);
}
public boolean traverse(ListNode right){
if(right==null) return true;
// 前序遍历(正常遍历顺序)
boolean flag = traverse(right.next);
// 后序遍历(逆向遍历顺序)
left = left.next;
return flag && (left.val==right.val);
}
}
了解 链表的 前序遍历 后序遍历