LeetCode234回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
输入:head = [1,2,2,1]
输出:true
输入:head = [1,2]
输出:false
思想
时间复杂度O(n),空间复杂度O(1)
设中间元素为mid
第一遍遍历计算链表的size,
第二遍遍历转置从链表开头到中间位置的元素,
第三遍遍历,一一对比链表开头与mid后的元素
(其实第一遍遍历应该可以和第二遍合并)
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Tools {
public:
template<typename T>
void vector_1_show(vector<T> num) {
for (auto a : num)
cout << a << " ";
cout << endl;
}
template<typename T>
void vector_2_show(vector<vector<T>> num) {
for (auto a : num) {
for (auto b : a) {
cout << b << " ";
}
cout << endl;
}
}
int list_size(ListNode* head) {
if (head == nullptr)
return 0;
int size = 1;
ListNode* p = head;
while (p->next != nullptr) {
size++;
p = p->next;
}
return size;
}
void show_ListNodes(ListNode* head) {
ListNode* p = head;
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << "" << endl;
return;
}
ListNode* create_ListNodes(std::vector<int>& data) {
if (data.size() == 0)
return nullptr;
ListNode* head = new ListNode(data[0]);
int i = 1;
ListNode* p = head, * q = head;;
while (i < data.size()) {
p->next = new ListNode(data[i++]); //这个new要回收地址吗
p = p->next;
}
// delete(q);
return head;
}
};
class Solution {
public:
bool isPalindrome(ListNode* head) {
int size = 0,flag=0,i=1;
Tools t;
size = t.list_size(head);
//cout << "size " << size << endl;
if (size <= 1)
return true;
flag = size / 2 + 1;
ListNode* mid = head;
while (i++ < flag) {
mid = mid->next;
}
//cout << "mid" << mid->val << endl;
ListNode* p = head->next;
ListNode* tail = head;
while (p != mid) {
tail->next = p->next;
p->next = head;
head = p;
p = tail->next;
}
if (size % 2 != 0) {
mid = mid->next;
}
ListNode* pp = head, * qq = mid;
while (pp != nullptr && qq != nullptr) {
//cout << " pp:" << pp->val << " qq:" << qq->val << endl;
if (qq->val != pp->val) {
return false;
}
pp = pp->next;
qq = qq->next;
}
return true;
}
};