鏈表、隊列、棧的相關應用(一)鏈表的迴文結構

最近在對學習的鏈表、隊列、棧等進行學習與總結,將遇到的題目總結出來,供大家交流

知識點:鏈表、棧

題目:

對於一個鏈表,,判斷其是否爲迴文結構。

給定一個鏈表的頭指針A,請返回一個bool值,代表其是否爲迴文結構。保證鏈表長度小於等於900。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {

}

};


思路:

1.利用快慢指針,快指針每次進兩格,慢指針每次進一格,當快指針指到NULL末尾時,慢指針指到中間位置

2.逆序指針

3.從頭尾指針進行比較


代碼:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
      
        if(A->next == NULL)//只有一個元素爲迴文
            return true;
        else if(A == NULL)//空元素不是迴文
            return false; 
        //快慢指針找出中間節點
        ListNode *fast = A;//均指向頭結點
        ListNode *slow = A;
        ListNode *temp, *cur;
        while(fast->next != NULL && fast != NULL) //保證fast的下下個節點不爲空
        {
           // temp = slow; // temp 是保存slow的前一個節點,即第一部分的最後一個節點
            fast = fast->next->next;
            slow = slow->next;// 爲奇數,slow爲中間節點,偶數時,slow爲第二部分第一個節點
        }//跳出程序的時候slow爲中間節點
        
        cur = slow->next;
        slow ->next = NULL;
        
        //反轉鏈表
        while(cur!=NULL)  
          {  
            temp = cur->next;      //mid,cur,temp三個指針操作反轉鏈表。  
            cur->next = slow;  
            slow = cur;  
            cur = temp;  
          } 
        while(A != NULL && slow != NULL)  
            {  
            if(A->val == slow->val)  
                {  
                A = A->next;  
                slow = slow->next;  
            }  
            else
                return false;  
        } 
        return true;
    }
   

思路2:複製鏈表A,將鏈表中的元素通過push壓入棧,再利用出棧,比較stack.top()(尾部元素) 和鏈表A(頭部元素)是否相等

代碼:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {  
public:  
    bool chkPalindrome(ListNode* A) { 
        if(A==NULL)
            return true;
        ListNode *B ;
        B = A;
        stack<int> st;


        while(B != NULL)
        {
            st.push(B->val);
            B = B->next;
        }
        
        while(A != NULL)
        {
            if(st.top() == A->val)
            {
                st.pop();
                A = A->next;
            }
            else 
                return false;
        }
        return true;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章