import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * 对于一个回文链表可以发现,当指针节点在对其进行遍历时,走到中间位置就等同于从中间倒着往前走 * 如 1->2->3->2->1,1->2->2->1 * 所以可以将中间以后的部分视为前半部分的反转 * 因此可以将中间以后的部分进行反转,就能得到一个和前半部分相同的链表,这也变成了判断回文结构的条件 */ public boolean isPail (ListNode head) { if(head == null || head.next == null){ return true; } ListNode slowNode = head; ListNode fastNode = head; while(fastNode!=null&&fastNode.next!=null){ fastNode = fastNode.next.next; slowNode = slowNode.next; } ListNode curNode = slowNode.next; ListNode preNode = slowNode; ListNode tempNode = null; while(curNode!=null){ tempNode = curNode.next; curNode.next = preNode; preNode = curNode; curNode = tempNode; } slowNode.next = null; while(preNode!=null && head!=null){ if(preNode.val!=head.val){ return false; } preNode = preNode.next; head = head.next; } return true; } }