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?
Could you do it in O(n) time and O(1) space?
找到list的中点, 然后翻转后面的list 一一对比
public class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode fast = head, slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode cur = reverse(slow.next);// 这里导入的是中点的下一个 因为这种找中点情况 偶数时候是在左中点, 奇数时候是在正中点
while (cur != null) {////这里不能是head!=null 对于0->0这个list head后面还有一个元素0
if (head.val != cur.val) {
return false;
}
head = head.next;
cur = cur.next;
}
return true;
}
public ListNode reverse(ListNode node) {
ListNode dummy = new ListNode(0);
dummy.next = node;
ListNode next = node.next;
while (next != null) {
node.next = next.next;
next.next = dummy.next;
dummy.next = next;
next = node.next;
}
return dummy.next;
}
}
没有评论:
发表评论