题解 | #牛群编号的回文顺序#
牛群编号的回文顺序
https://www.nowcoder.com/practice/e41428c80d48458fac60a35de44ec528
不使用额外的空间。
大致思路:使用双指针,快指针移动的速度是满指针移动速度的两倍,快指针到达链表的末尾时,慢指针位于链表的中间位置。
此时,反转后半部分的链表,然后依次比较前后两半链表是否相同即可。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return bool布尔型
*/
public boolean isPalindrome (ListNode head) {
if (head == null || head.next == null) return true;
ListNode left = head;
ListNode right;
ListNode slow = head;
ListNode fast = head;
//如果节点个数是奇数,那么fast最终指向的位置是最后一个节点
//如果节点个数是偶数,那么fast指向的位置是最后一个节点的前一个元素,此时还需要让fast后移一位
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
if (fast.next != null && fast.next.next == null) fast = fast.next;
}
//记录下来末尾节点
//开始反转链表,反转 slow 之后的节点
right = slow.next;
ListNode tmp = right.next;
slow.next = null;
right.next = slow;
slow = right;
right = tmp;
//循环结束之后,right为null,slow指向最后一个节点,至此后半部分的链表反转完成
while (right != null) {
tmp = right.next;
right.next = slow;
slow = right;
right = tmp;
}
right = slow;
//开始比较元素的值
while (left != null) {
if (left.val != right.val) return false;
left = left.next;
right = right.next;
}
return true;
}
}
