234.回文链表2
感觉自己还是有点时间,然后又学了两种解法。那就一起整理一下。
法一:反转链表后比较
题解看我的这一篇就行(click)
法二:数组+双指针
思路很简单,就是用while循环遍历一下整个链表将对应的值复制到数组中,然后定义两个指针front和back,从前往后和从后往前同时开始,不等就返回false了。
代码:
/**
* 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 {
public boolean isPalindrome(ListNode head) {
//2.数组+双指针
List<Integer> vals=new ArrayList<Integer>();
//将链表的值复制到数组中
ListNode curr=head;
while(curr!=null){
vals.add(curr.val);
curr=curr.next;
}
//使用双指针判断其是否是回文
int front=0;
int back=vals.size()-1;
while(front<back){
if(!vals.get(front).equals(vals.get(back))){
return false;
}
front++;
back--;
}
return true;
}
}
法三:递归
这个就老好玩了,我以前觉得老难了,因为不理解,也有可能是因为我在这个起步阶段,还没碰到难点,嘿嘿,不管不管。
首先他就是让你直接到该链表的最后一个值,然后在不满足情况的时候慢慢的往回退。想象一下,你拿着个绳子,绳子下面又掉了个石头,然后凭着自己的意愿将石头抛了下去,(感觉这个例子不太好),直到绳子绷紧就是下不去了,嗯,接着你又想收了,然后慢慢的收,一点点扯的这种。但是有条件的。回归到题目本身,往下放的条件是curr.next不为空,当其为空之后返回其上一个结点。看代码吧
代码:
/**
* 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 {
private ListNode frontPointer;
//递归函数
private boolean recursivelyCheck(ListNode curr){
if(curr!=null){
if(!recursivelyCheck(curr.next)) return false;
if(curr.val!=frontPointer.val) return false;
frontPointer=frontPointer.next;
}
return true;
}
public boolean isPalindrome(ListNode head) {
//3、递归
frontPointer=head;
return recursivelyCheck(head);
}
}
祝你生活愉快~
最近生活还行,你呢?哒哒哒~