55 lines
1.5 KiB
Java
55 lines
1.5 KiB
Java
/*
|
||
* @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
|
||
|