判斷回文


12、給定一個單鏈表(無環),請判斷是否是回文結構。在刪除倒數第K個節點后,是否為回文結構。

(回文結構:從頭到尾遍歷節點的值序列結果,與從尾到頭遍歷的值序列結果是一樣的)

要求: 要考慮時間復雜度和空間復雜度

 

示例 1:

輸入: 1->8->4->4->8->1, K=3

輸出: true, true

示例 2:

輸入: 1->2->5->2->1, K=2

輸出: true, false

示例 3:

輸入: 1->2->5->3->2->1, K=3

輸出: false, true

//12、給定一個單鏈表(無環),請判斷是否是回文結構。在刪除倒數第K個節點后,是否為回文結構。
//(回文結構:從頭到尾遍歷節點的值序列結果,與從尾到頭遍歷的值序列結果是一樣的)
////要求: 要考慮時間復雜度和空間復雜度
// 1->8->4->4->8->1, K=3
// true, true

//思路: 將鏈表的頭和尾分別向中間靠攏,進行判斷是否相等,若有一個不相等則不是回文
#include <iostream>
#include <list>
#include <iterator>
using namespace std;

class S
{
public:
    // 判斷回文函數,是返回true,不是返回false
    bool check(list<int> list_1)
    {
        bool flag = true;
        //l_end是鏈表最后一個元素的位置

        list<int>::iterator l_begin = list_1.begin(), l_end = --list_1.end();
        for(int i = 0; i< list_1.size()/2; i++)
        {
            if (*l_begin != *l_end)
            {
                flag = false;
            }
            else
            {
                l_begin++;
                l_end--;
            }
        }
        return flag;
    }

    // 刪除鏈表倒數第K個元素
    void modifyList(list<int> &list_1, int k)
    {
        list<int>::iterator l_end = list_1.end(); // l_end是尾后迭代器
        while(k--)  // 找到第k個元素的位置
        {
           l_end--;
        }
        list_1.erase(l_end);// 刪除倒數第k個元素
    }
    //輸出結果
    void Print(bool flag)
    {
        if (flag)
            cout <<"true";
        else
            cout << "false";
    }
};


//  1,8,4,4,8,1 k=3,  true, true
//  1,2,5,2,1 k=2 true, false
//  1,2,5,3,2,1, k=3, false, true
int main()
{
    S s;
    list<int> list_1={1,8,4,4,8,1};

    int k =3;

    //判斷是否是回文
    bool flag = s.check(list_1);
    // 刪除鏈表倒數第K個元素
    s.modifyList(list_1,k);
    bool flag2 = s.check(list_1);

    //輸出
    s.Print(flag);
    cout << ",";
    s.Print(flag2);
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM