回文链表
1.题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
2.思路
回文链表可以使用两种方式来实现。
第一种方式是将链表中的元素放到数组中,然后利用双指针的方式来判断是否是回文数组。
第二种方式是利用递归的方式。我们可以用一个指针指向当前节点,然后通过递归的方式找到当前节点的最后一个节点,然后将指针指向的当前节点与递归到的最后一个节点进行对比。由于是递归到最后,再回来。所以会从后往前依次进行对比。
3.代码
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 firstNode;
public boolean isPalindrome(ListNode head) {
firstNode = head;
return recursivelyCheck(head);
}
// 使用递归的方式实现
public boolean recursivelyCheck(ListNode currentNode){
if(currentNode != null){
// 因为找到最后返回true,这里取反就是false,就不会进入到这个逻辑中去
if(!recursivelyCheck(currentNode.next)){
return false;
}
// 如果不相等则返回false,则会引起上面一个判断会一直返回false
if(currentNode.val != firstNode.val){
return false;
}
firstNode = firstNode.next;
}
// 始终返回true
// 1.为了找到链表的最后而停下
// 2.为了最后成功返回true
return true;
}
}