问题描述
编写一个函数,检查输入的链表是否是回文的。
示例:
输入: 1->2
输出: false
输入: 1->2->2->1
输出: true
方法一
/**
* 要求时间复杂度为O(n),空间复杂度为O(1)
*1.获取中间位置
* 获取中间位置,可以通过快慢指针实现
*2.从中间位置一次向两侧对比
* 从中间向两侧对比,需要将左半部分进行翻转,才能够实现
*/
public boolean isPalindrome(ListNode head) {
if(head==null){
return true;
}
//1.获取中间位置
//获取中间位置,可以通过快慢指针实现
ListNode slow = head;
ListNode fast = head;
//左侧链表翻转后的头部
ListNode pre = null;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
//记录下一个节点
ListNode tmpNextForSlow = slow.next;
//slow结点针对于pre是头部插入
slow.next = pre;
pre = slow;
//将slow指向下一个结点
slow = tmpNextForSlow;
}
ListNode right;
//判断当前的链表长度是奇数还是偶数
//1->2->3 如果fast有值,则为奇数长度.pre 指向1 ,slow指向2,那么需要right指向3即可
//1->2->3->4 如果fast有值,则为奇数长度.pre 指向2,slow指向3,那么需要right=slow即可
if(fast!=null){
right = slow.next;
}else{
right = slow;
}
//2.从中间位置一次向两侧对比
//从中间向两侧对比,需要将左半部分进行翻转,才能够实现
while(right!=null&&pre!=null){
if(right.val!=pre.val){
return false;
}
right = right.next;
pre = pre.next;
}
return true;
}