• leetcode- 234 Palindrome Linked List


    题目

      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?

    题意分析

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

      所谓回文,即从左往右和从右往左读都是一样的。例如:

      “abcdefgfedcba”

      1->2->3->3->2->1

      我们现在要做的,就是判断给定的链表是否满足这个特性。

      这题还有一个难点,就是时间复杂度与空间复杂度的限制。特别是空间复杂度限制太严格了。

    解法一:

    使用一个栈把遍历一遍的节点全存下来.

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            ListNode *l=head;
            stack<ListNode *> s;
            while(head)
            {
                s.push(head);
                head=head->next;
                
            }
            int n=s.size()/2;
            for(int i=0;i<n;i++)
           // while(!s.empty())
            {
                ///cout<<i<<"   "<<s.size()/2<<endl;
                cout<<s.top()->val<<endl;
                cout<<l->val<<endl;
                if(s.top()->val==l->val)
                {
                    
                    l=l->next;
                    s.pop();
                }
                else 
                    return false;
                    
                    
            }
            return true;
        }
    };
    

     

    但是空间复杂度为N, 因此考虑怎么减少空间复杂度,

    解法二: 使用递归的方法,虽然有局部的空间占用,但是可以规避空间复杂度的问题:

    • 终止条件:到达中间节点
    • 判断  链表: n2->n3->n4->...->n(size()-1)&&n1==n(size()); 
            ListNode* temp=head;
            int length=0;
            while(temp)
            {
                length++;
                temp=temp->next;
            }
            int mid=(length+1)/2;
            if(head==NULL||head->next==NULL)
                return true;
            
            ListNode * result=isEqual(head,1,mid,length);
            if(result!=NULL)
            {
                return true;
            }
            else
                return false;
    
        }
        ListNode * isEqual(ListNode *head, int index,int mid, int length)
        {
            if(mid==index&& length%2==1)
            {
                return head->next;
            }
                
            else if(mid==index && length%2==0)
            {
                if(head->val==head->next->val)
                {
                    if(head->next->next!=NULL)
                        return head->next->next;
                    else
                        return head->next;
                }
                else
                    return NULL;
            }
            else
            {
                ListNode *t=isEqual(head->next,(index+1),mid,length);
                if(t==NULL)
                    return NULL;
                else if(head->val==t->val)
                {
                    if(t->next!=NULL)
                        return t->next;
                    else
                        return t;
                }
                else
                    return NULL;
                
                
                
                
            }
    

      

    解法三:

    • 得到中点作为截止条件
    • 将后半段链表逆序
    • 遍历前半段与后半段
        
        ListNode * reverse(ListNode * head, int mid)
        {
            while(mid!=0)
            {
                head=head->next;
                mid--;
            }
            ListNode * a=NULL;
            while(head!=NULL)
            {
                
                ListNode *t=head;
                head=head->next;
                t->next=a;
                a=t;
                cout<<a->val<<endl;
               
             //   cout<<head->val<<endl;
            }
            return a;
        }
        bool isPalindrome(ListNode* head) {
     if(head==NULL||head->next==NULL)
                return true;
            int length=0;
            ListNode *c=head;
            while(c)
            {
                length++;
                c=c->next;
            }
            cout<<(length+1)/2<<endl;
            ListNode * a=reverse(head,(length+1)/2);
            while(a)
            {
                if(head->val==a->val)
                {
                    head=head->next;
                    a=a->next;
                }
                else
                    return false;
            }
                
              return true;  
                
                
            }
        
    

      

  • 相关阅读:
    崔工读过的技术书籍,持续更新中!
    Python-S9——Day110-Git继续
    Python-S9——Day115-Flask Web框架
    树形dp 之 小胖守皇宫
    线性dp 之 奶牛渡河
    网课神器之obs-studio的安装使用
    Convert to Ones
    UVA 10653.Prince and Princess
    HDOJ 1051. Wooden Sticks
    洛谷P1063.能量项链
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7274920.html
Copyright © 2020-2023  润新知