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);}
}
祝你生活愉快~
最近生活还行,你呢?哒哒哒~