码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 234 Palindrome Linked List

时间:2016-07-30 16:37:05      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

题意:给定一个单链表,判断该链表是否回文。要求O(N)的时间复杂度,O(1)的空间复杂度

 

也是一道easy题目,但是由于数据结构比较渣,之前没有接触过链表反转的问题,在这里记下这个算法。

 

思路就是找到链表的中间,把后半段链表反转过来,这个复杂度是O(n),在O(n)遍历一遍看看跟前半段是否一样,所以总的复杂度也是O(n)。

链表反转的代码为:

1 tmp = list -> next;
2 while(list -> next != NULL){
3   p = tmp -> next;
4   tmp -> next = p -> next;
5   p -> next = list -> next;
6   list -> next = p;        
7 }

这里,list是要反转的链表的前一个节点,list -> next指向了要反转的第一个元素,例如,有一个链表a -> b -> c -> d,想要反转成d -> c -> b -> a,

那么使用上面算法的结构就是 list -> a -> b -> c -> d ,然后根据代码的原理,一次把b,c,d放在最前面,其余结构不变,具体的流程就是:

a -> b -> c ->d ==> b -> a -> c -> d ==> c -> b -> a -> d ==> d -> c -> b -> a.

这样这道题就很简单了,AC代码如下:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        int n = 0;
        ListNode *pos = head;
        while(pos != NULL){
            n++;
            pos = pos -> next;
        }
        if(n == 0 || n == 1)
            return true;
        n = n / 2 - ((n % 2) ^ 1);
        pos = head;
        for(int i = 0 ; i < n ; i++){
            pos = pos -> next;
        }
        
        ListNode *list = pos;
        ListNode * tmp = pos -> next;
        while(tmp-> next != NULL){
            ListNode *p = tmp->next;
            tmp -> next = p -> next;
            p -> next = list -> next;
            list -> next = p;
        }
        
        ListNode *h1 = list -> next;
        while(h1 != NULL){
            if(h1 -> val != head -> val){
                return false;
            }
            h1 = h1 -> next;
            head = head -> next;
        }
        return true;
    }
};

 

Leetcode 234 Palindrome Linked List

标签:

原文地址:http://www.cnblogs.com/nevgivin/p/5720980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!