对应的LeetCode题:Palindrome Linked List - LeetCode
参考:leetcode-java/README.md at master · andavid/leetcode-java https://github.com/andavid/leetcode-java/blob/master/note/234/README.md
逻辑说明:
代码说明(带注释):
/**
* 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 prev = null;//前半部分反转后的链表头部。
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) { //循环结束条件:fast==null(fast越界)或fast.next == null(fast为最后一个节点)
fast = fast.next.next;//快指针每次前进两步;
ListNode next = slow.next;//缓存一下慢指针的后续节点,后面移动时使用。
slow.next = prev;//反转前半部分的链表。(反转每次都是在链表头部添加新节点)
prev = slow;//反转后prev前进一步,移至反转链表的头部;
slow = next;//然后慢指针前进一步;
}
if (fast != null) {//此时:fast.next == null,fast为最后一个节点,fast的轨迹是:1,3,5,7...所以此时链表为奇数。
//此刻:慢指针刚好在中间的奇数点,需后移修正。
slow = slow.next;
}
//另一种情况:fast==null,则有偶数个元素。slow位于后半截的第一个节点,无需修正。
while (slow != null) {//后续,慢指针继续后移,遍历链表后半部分,与反转后的前半部分依次比较;
if (slow.val != prev.val) {
return false;
}
slow = slow.next;
prev = prev.next;
}
return true;
}
}