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; }