描述:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
思路分析:
细节分析:
如果只有一个节点1,fast = slow = 1
如果有1->2两个节点,fast = null,slow = 2
如果有1->2->3三个节点,fast = null,slow = 2
如果有1->2->3->4四个节点,fast = null,slow = 3
我们可以得出结论
当链表长度为偶数时,slow指针指向链表中间位置靠后的那一个 当链表长度为奇数时,slow指针指向链表中间位置
1、先找到链表的中间位置
2、反转后半部分链表
3、同时从头和尾部向中间遍历,如果有不同值,则不是回文
代码实现:
/**
* 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 || head.next == null) return true;
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode pre = slow;
slow = slow.next;
ListNode post;
while (slow != null) {
post = slow.next;
slow.next = pre;
pre = slow;
slow = post;
}
ListNode p = head, q = pre;
boolean res = true;
while (p != q && p.next != q) {
if (p.val != q.val) {
res = false;
break;
}
p = p.next;
q = q.next;
}
if (p.val != q.val)
res = false;
return res;
}
}