给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 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) {
if(head==null||head.next==null){
return true;
}
ListNode pre =null;
ListNode curr = head;
//找到尾节点
while(curr.next!=null){
pre= curr;
curr=curr.next;
}
if(head.val!= curr.val){
return false;
}
// 把尾节点弄没,继续递归比较
pre.next=null;
return isPalindrome(head.next);
}
}
通过把节点放入到arraylist中,这样减少了时间复杂度
/**
* 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) {
if(head==null||head.next==null){
return true;
}
ArrayList <Integer> arr = new ArrayList<>();
ListNode curr =head;
while(curr.next != null){
arr.add(curr.val);
curr =curr.next;
}
//把最后一个节点放入arr中,上面的循环中没有放进去最后一个节点
arr.add(curr.val);
int start =0;
int end = arr.size()-1;
while(start <= end){
//注意这个位置要用equals,不要用==;因为我们用的泛型是Integer,用== 只能比较-127~127之间的数,如果超过了这个数值,在内部就是通过new 来创建对象,此时== 就无法比较了。
if(!arr.get(start).equals(arr.get(end))){
return false;
}
start++;
end--;
}
return true;
}
}