/* * @lc app=leetcode id=234 lang=java * * [234] Palindrome Linked List */ // @lc code=start /** * 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 { /** * linked list求中点方案:快慢指针: * 当fast移动n次时,列表节点个数为1+2n或2n * 此时,slow移动n次时遍历节点个数为1+n * 即,节点总个数为奇数时,slow刚好位于中点 * 当节点总个数为偶数时,slow位于n+1节点,即下半部分链表的开始节点 * @param head * @return */ public boolean isPalindrome(ListNode head) { ListNode slow = head, fast = head, prev = null, t; while(fast != null && fast.next != null) { fast = fast.next.next; t = slow.next; slow.next = prev; prev = slow; slow = t; } // 此时,prev为上半部分开始节点,cur为下半部分开始节点 // 如果fast不为空,节点总数为奇数,fast为空,节点总数为偶数 if(fast != null) { slow = slow.next; } boolean f = true; while(slow != null) { if(slow.val != prev.val) { f = false; } slow = slow.next; prev = prev.next; } return f; } } // @lc code=end