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?
这种题不希望再错了。明明很简单的。其实leetcode上面的题说白了就是能不能跟你理解的类型联系起来。如果知道类型了,而且也有思路,写不对,很气的。
这道题的思路是:1. 快慢指着找到中间点(都从head开始,找到中间的值。如果是odd, 那么slow停留的位置在正中间;如果希望找到)2. 翻转后半段,这里需要注意在最后返回的时候,再把传入的root节点的next置为空。
代码:
ublic boolean isPalindrome(ListNode head) {
if(head == null ||head.next == null ) return true;
ListNode slow = head;
ListNode fast = head;// 1 2 3 4 5
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
ListNode reverseHead = reverse(slow.next);
while(head != null && reverseHead != null){
if(head.val != reverseHead.val){
return false;
}else{
head = head.next;
reverseHead = reverseHead.next;
}
}
return true;
}
private ListNode reverse(ListNode node){
ListNode dummy = new ListNode(-1);
dummy.next = node;
ListNode pre = dummy;
ListNode cur = node;
while(cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
node.next = null;
return pre;
}