题目如下
解题思路:
首先我们找到该链表的中点节点
ListNode slow, fast;
slow = fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// slow 指针现在指向链表中点
如果fast
指针没有指向null
,说明链表长度为奇数,slow
还要再前进一步
if (fast != null)
slow = slow.next;
然后就可以从slow开始反转后面的链表 ,反转后就可以比较是否是回文链表了
ListNode left = head;
ListNode right = reverse(slow);
while (right != null) {
if (left.val != right.val)
return false;
left = left.next;
right = right.next;
}
return true;
整合代码如下
public boolean isPalindrome(ListNode head) {
ListNode slow, fast;
slow=fast=head;
while (fast.next!=null&&fast!=null){
slow=slow.next;
fast=fast.next.next;
}
if (fast!=null){
slow=slow.next;
}
ListNode left=head;
ListNode right=reserve(slow);
while (right!=null){
if (right.val!=left.val){
return false;
}
left=left.next;
right=right.next;
}
return true;
}
public ListNode reserve(ListNode a){
ListNode pre ,cur ,next;
pre=null; cur=a;next=a;
while (cur!=null){
next=cur.next;
// 逐个结点反转
cur.next= pre;
// 更新指针位置
pre=cur;
cur=next;
}
// 返回反转后的头结点
return pre;
}
算法总体的时间复杂度 O(N),空间复杂度 O(1),已经是最优的了。
该题目还有两种方法想深入了解请参照letcode链接思路力扣