思路:
这里使用快慢指针,将前半部分的链表进行反转(最后没有恢复)
定义两个指针:slow每次走一步,fast每次走两步
当fast == null的时候,此时slow恰好走到 (len + 1) / 2的位置;
将slow作为后半链表的头,pre作为前班链表的头;
考虑的是;当fast == null 表示链表长度为偶数, fast.next == null 表示链表长度为奇数(跟着流程画图清晰)
代码:
/**
* 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) {
ListNode slow = head, fast = head; // 快慢指针
ListNode pre = head, prepre = null; // pre 执行反转后的头,prepre是前驱作更新
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
pre.next = prepre;
prepre = pre;
}
if (fast != null) slow = slow.next; // fast != null 说明是奇数
while (pre != null && slow != null) {
if (pre.val != slow.val) return false;
pre = pre.next;
slow = slow.next;
}
return true;
}
}