美文网首页
234 palindrome linked list

234 palindrome linked list

作者: larrymusk | 来源:发表于2017-11-20 20:23 被阅读0次

1,找到中间节点然后反转后半部,
2,从头到尾依次比较每个节点的值

当链表个数是偶数个数的时候很好理解,当时奇数的时候有一个比较tricky的地方

1->2->3->NULL
反转后半部之后为3->2->NULL.
前半部1->还是指向2 1->2->NULL.

因此可以同等长度的比较,知道后半部的指针为空

    half = reverseList(slow);
    
    while(half){
        if(half->val == head->val){
            half = half->next;
            head = head->next;
        }else
            return false;
    }
    
struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL)
        return NULL;
    if(head->next == NULL)
        return head;
    struct ListNode *node;

    node = reverseList(head->next);
    head->next->next = head;
    head->next = NULL;

    return node;    
}

bool isPalindrome(struct ListNode* head) {
    
    struct ListNode *slow, *fast;
    slow = fast = head;
    struct ListNode *half;

        
    while(fast){
        fast = fast->next;
        if(fast){
            fast = fast->next;
            slow = slow->next;
        }
    }
    //slow is midst
    half = reverseList(slow);
    
    while(half){
        if(half->val == head->val){
            half = half->next;
            head = head->next;
        }else
            return false;
    }
    
    return true;
}

相关文章

网友评论

      本文标题:234 palindrome linked list

      本文链接:https://www.haomeiwen.com/subject/rydbvxtx.html