想法
- 将值放在数组中,然后在双指针遍历。
class Solution {
public boolean isPalindrome(ListNode head) {
ArrayList<Integer> listNode=new ArrayList<>();
ListNode begin=head;
while(begin!=null){
listNode.add(begin.val);
begin=begin.next;
}
int start=0,end=listNode.size()-1;
while(start<=end){
if(listNode.get(start)!=listNode.get(end)) return false;
start++;
end--;
}
return true;
}
}
- 利用反转链表来实现,之后要记得反转回来。
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null) return true;
ListNode medium=findMedium(head);
ListNode pr=reverse(medium.next);
ListNode start=head,end=pr;
while(start!=null&&end!=null){
if(start.val!=end.val) return false;
start=start.next;
end=end.next;
}
medium.next=reverse(pr);
return true;
}
public ListNode findMedium(ListNode head){
ListNode fast=head,slow=head;
while(fast.next!=null&&fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
private ListNode reverse(ListNode head) {
ListNode next = null,node=head,temp;
while (node != null) {
temp=node.next;
node.next=next;
next=node;
node=temp;
}
return next;
}
}
方法2的简化:在进行快慢链表的时候,同时进行链表的反转。