题目:
//方法一,空间复杂度O(n)
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> nums; //放进数组后用双指针判断
ListNode* cur = head;
while(cur){
nums.emplace_back(cur->val);
cur = cur->next;
}
for(int i=0, j=nums.size()-1; i < j; i++, j--){
if(nums[i]!=nums[j]) return false;
}
return true;
}
};
//方法二,空间复杂度O(1)
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head) return true;
ListNode* end = findend(head);
ListNode* head1 = reverseList(end->next);
ListNode* cur1 = head;
ListNode* cur2 = head1;
while(cur1&&cur2){
if(cur1->val!=cur2->val) return false;
cur1 = cur1->next;
cur2 = cur2->next;
}
end->next = reverseList(head1); //恢复链表
return true;
}
//寻找链表前半部分的末尾节点
ListNode* findend(ListNode* head){
ListNode* slow = head;
ListNode* fast = head;
while(fast->next&&fast->next->next){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
//翻转链表
ListNode* reverseList(ListNode* head){
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode* tmp;
while(cur){
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};