回文链表(简单)
2020年10月8日
题目来源:力扣
解题
如果是回文,那么前半部分链表反转后的链表应该与后半部分的链表完全一致
- 反转链表+比较
反转链表方法可看这里,首先算出链表长度,然后取一半进行反转,反转后需要判断长度的奇偶,奇数则省略中间一个数,偶数照常计算,前后两链表遍历对比,不同则返回false
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null) return true;
ListNode tmp=head;
int len=0;
//算出链表长度
while(tmp!=null){
len++;
tmp=tmp.next;
}
if(len==1) return true;
if(len==2) return head.val==head.next.val;
ListNode pre=head;
ListNode cur=head.next;
ListNode cur_t=head.next.next;
pre.next=null;
for(int i=1;i<len/2;i++){
cur.next=pre;
pre=cur;
cur=cur_t;
cur_t=cur_t.next;
}
//如果是奇数,后面的链表需要往后一步
if(len%2==1) cur=cur_t;
while(pre!=null && cur!=null){
if(pre.val!=cur.val) return false;
pre=pre.next;
cur=cur.next;
}
return true;
}
}