进步感受:

well done~~!,又是自己做出这道题目了,没有一点提示,经过不断的锻炼大脑好像慢慢被活化了,灵感崩发,让我想到了链表平分+翻转对比,来实现判断是否为回文!

解题思路:

官方的解题思路跟我的是一样的,都是平分链表+翻转比较,但是,官方是从后面翻转,我则是从前面翻转,导致我要考虑链表奇数偶数个的情况。

具体实现步骤:

1,使用快慢指针,平分两个链表;

2、从中点slow指针,开始翻转链表,之后比较是否相等,从而判断是否是回文结构;

3、有一点要注意的是,翻转的时候,其实会断开head的链表的。

// 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了

// 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快

// 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数

import java.util.*;

public class Solution {

    /**
     * 官方的解法,跟我的解法是一样的,
     * 平分链表后,反转一半,但是我是从左边翻转,
     * 导致,要考虑奇偶数个的情况。
     */
    public boolean isPail (ListNode head) {
        if(head==null) {
            return false;
        }
        ListNode fast = head;
        ListNode slow = head;

        while(fast!=null && fast.next!=null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 这里有意思,
        // slow后面的链表翻转的同时
        // 第一次翻转时,prev==null
        // 会导致head链表断开到slow节点
        // 而反转列表从slow节点开始
        // 举个例子head={1,2,2,2,1},反转后
        // head={1,2,2}, slow={1,2,2} 
        slow = reverseListNode(slow);
        fast = head;
        while(slow != null) {
            if(slow.val != fast.val) {
                return false;
            }
            fast = fast.next;
            slow = slow.next;
        }

        return true;
    }


    /**
     * 我的解法
     * @param head ListNode类 the head
     * @return bool布尔型
     */
     // 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了
     // 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快
     // 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数
    public boolean isPail2 (ListNode head) {
        if(head== null) {
            return false;
        }
        if(head.next==null) {
            return true;
        }

        ListNode left = head;
        ListNode mid = head.next;
        ListNode right = head.next.next;

        while(right!=null && right.next!=null) {
            left = left.next;
            mid = mid.next;
            right = right.next.next;
        }

        ListNode leftNode,righNode;
      
        if(right == null) {  // 说明是偶数个
            left.next = null;
            leftNode = reverseListNode(head);
            righNode = mid;
        } else { // 说明是奇数个
            left.next = null;
            leftNode = reverseListNode(head);
            righNode = mid.next;
        }

        while(leftNode!=null && righNode!=null) {
            if(leftNode.val == righNode.val) {
                leftNode = leftNode.next;
                righNode = righNode.next;
            } else {
                return false;
            }
        }
       
        return leftNode==righNode;
    }

    // 反转链表
    ListNode reverseListNode(ListNode head) {
        ListNode curr = head;
        ListNode prev = null;

        while(curr!=null) {
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }
        return prev;
    }

  
}