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?
之前想过的一个方法是先将其看成是判断Parlindrome 的string来做,将Linked List里的数取出来转换成string来判断,但是有问题:一是linked list里的数会不会过多使其溢出,二是对象和引用不匹配的问题
考虑用堆栈来解决这个问题,区分奇数长度和偶数长度的linked-list,奇数长度时取前[(n+1)/2-1]个数出来存入堆栈中;偶数长度取前n/2个数出来存入堆栈中;然后和剩下的链表中数进行比较。因为堆栈服从LIFO (last in first out)的原则,所以和链表中剩余的数相比较如果一直就是Parlindrome,不一致则不是。
public class Solution {
public boolean isPalindrome(ListNode head) {
ListNode first=head; //设置两个指针
ListNode second=head;
Stack<Integer> dz= new Stack<Integer>();
while(second!=null&&second.next!=null){
sc.push(first.val); //入栈
first=first.next;
second=fast.next.next;
}
if(second!=null){ //判断链表长度
first=first.next;
}
while(first!=null){
int num=dz.pop().intValue(); //出栈
if(first.val!=num){return false;}
first=first.next;
}
return true;
}
}
reference:http://blog.csdn.net/feige1990/article/details/47957095