部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

LeetCode--234. Palindrome Linked List(看单链表是否是回文)

方法1:使用栈将所有元素入栈,然后出栈一半的元素和链表前一半元素进行比较。时间O(n),空间O(n)

public boolean isPalindrome(ListNode head) {
    if(head ==null)
        return true;
    ListNode p = head;
    Stack<Integer> stack = new Stack();
    while(p!=null){
        stack.add(p.val);
        p=p.next;
    }
    int num = (stack.size()-1)/2;
    
    p = head;
    for(int i = 0 ; i <= num ; i++){
        if(stack.pop()!=p.val)
            return false;
        p=p.next;
    }
    return true;

}

 

方法2:将链表后半部分逆置,然后顺序比较前半部分和后半部分。时间O(n),空间O(1)

public static boolean isPalindrome(ListNode head) {
    if(head ==null)
        return true;
    ListNode p = head;
    int len = 0 ;
    while(p!=null){
        len++;
        p=p.next;
    }        
    int loc = (len-1)/2;        
    p=head;
    while(loc !=0 ){
        p=p.next;
        loc--;
    }
    ListNode h = new ListNode(0); //后半部分的头

    ListNode q ;
    p=p.next;
    while(p!=null){ //先将后半部分逆置
        q = p.next;
        p.next = h.next;
        h.next = p ;
        p=q;
    }
        
    h = h.next;
    p=head;
    while(h!=null){
        if(h.val!=p.val)
            return false;
        h = h.next;
        p = p.next;
    }
    return true;
}

 

posted @ 2015-07-18 10:33  流了个火  阅读(102)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats