LEETCODE#234回文链表

请判断一个链表是否为回文链表。

1.  前半段链表元素进栈,找到中间节点后边比较边出栈

bool isPalindrome(ListNode* head) {
    if(head==NULL||head->next==NULL)    //特殊处理
    return true;

    ListNode *fast=head;
    ListNode *slow=head;
    ListNode *left=head;
        stacks;
        s.push(head->val);       //利用快慢指针法让slow找到中心点
    while(fast->next&&fast->next->next)
    {

        fast=fast->next->next;
        slow=slow->next;
        s.push(slow->val);
    }

    if(fast->next==NULL)//偶数链退栈处理,保证栈里面和slow的右边对称
    s.pop();
    while(!s.empty())
    {
        if(s.top()!=slow->next->val)
        {
            return false;
        }

        else
        {
            slow=slow->next;
            s.pop();
        }
    }
    return true;
}

2. 用快慢指针遍历的同时翻转前半部分,然后与后半部分比较即可

bool isPalindrome(ListNode* head) {
    if(!head || !head->next)
        return 1;
    ListNode *fast = head, *slow = head;
    ListNode *p, *pre = NULL;
    while(fast && fast->next){
        p = slow;
        slow = slow->next;    //快慢遍历
        fast = fast->next->next;

        p->next = pre;  //翻转
        pre = p;
    }
    if(fast)  //奇数个节点时跳过中间节点
        slow = slow->next;

    while(p){       //前半部分和后半部分比较
        if(p->val != slow->val)
            return 0;
        p = p->next;
        slow = slow->next;
    }
    return 1;
}

3. 将链表中的数据存入向量中,判断向量中元素是否为回文序列

bool isPalindrome(ListNode* head) {
    vector n;
    ListNode *p =head;
    while(p!=NULL)
    {
        n.push_back(p->val);
        p=p->next;
    }    
    int num = n.size();
    for(int i =0;i

4. 将链表中的数据存入栈

bool isPalindrome(ListNode* head) {
    stack s;
    ListNode *ptr = head;
    while(ptr)
    {
        s.push(ptr->val);
        ptr = ptr->next;
    }
    ptr = head;
    while(ptr)
    {
        if(ptr->val != s.top())
            return false;
        s.pop();
        ptr = ptr->next;
    }
    return true;
}

 

你可能感兴趣的:(LEETCODE)