Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
分析:palindrome:回文字,左后看都是一样。O(1)常数运行空间,说明不能通过建立数组等其他数据结构的方式来处理。
从左右看,都是一样,考虑找到链表的中间节点,然后将一般翻转,进行比较。
1. 查找中间节点(注意节点总数为奇数或者偶数的情况)
2. 翻转一半的链表
3. 比较
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isPalindrome(ListNode head) {
if (null == head || null == head.next) {
return true;
}
ListNode fast = head;
ListNode slow = head;
while (null != fast && null != fast.next) {
fast = fast.next.next;
slow = slow.next;
}
if (null == fast) {
slow = reverse(slow);
}else if (null == fast.next) {
slow = slow.next; //如果节点总个数为奇数,slow再向前移动一步,保证拆分出来的两个链表节点个数一样
slow = reverse(slow);
}
while (slow != null) {
if (head.val != slow.val) {
return false;
}
head = head.next;
slow = slow.next;
}
return true;
}
private ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode leftCursor = head.next;
head.next = null; //翻转后的链表尾部节点指向要置null
ListNode rightCursor;
while (leftCursor != null) {
rightCursor = leftCursor.next;
leftCursor.next = head;
head = leftCursor;
leftCursor = rightCursor;
}
return head;
}
}