判断链表是否为回文序列:
方法1:反转链表法:将原始链表元素值逆序保存到新创建的链表中,然后重新遍历两个链表,比较元素的值
优化1:只需要反转一半元素,先遍历一遍,得到总长度。然后重新遍历,到达一半时不是进行反转,而是比较两个链表。
优化2:双指针,fast一次走两步,slow一次走一步。当fast到达表尾时,slow刚好指向中间位置,这是可以开始逆序一般半的元素,按照优化一比较。
public static boolean isPalindromeByTwoPoints(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode slow = head, fast = head;
ListNode pre = head, prepre = null;
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
pre.next = prepre;
prepre = pre;
}
if (fast != null) {
slow = slow.next;
}
while (pre != null && slow != null) {
if (pre.val != slow.val) {
return false;
}
pre = pre.next;
slow = slow.next;
}
return true;
}