直接过
/**
* 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 Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> nums;
while(head){
nums.push_back(head->val);
head = head->next;
}
int n = nums.size();
if(n % 2 == 0){
int right = n/2;
int left = n/2-1;
while(left >= 0 && right < n){
if(nums[left] != nums[right])
return false;
left--;
right++;
}
}
else{
if(n == 1)
return true;
int left = n/2-1;
int right = n/2+1;
while(left >= 0 && right < n){
if(nums[left] != nums[right])
return false;
left--;
right++;
}
}
return true;
}
};
翻转链表
/**
* 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 Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode *fast = head, *slow = head;
while(fast->next && fast->next->next){//偶数个,fast停在倒数第二节电,奇数个,fast停在最后
//偶数个,slow停在n/2-1,奇数个,slow停在n/2;
fast = fast->next->next;
slow = slow->next;
}
slow->next = reverseList(slow->next);
slow = slow->next;
while(slow){
if(head->val != slow->val)
return false;
slow = slow->next;
head = head->next;
}
return true;
}
ListNode* reverseList(ListNode* head){
ListNode *pre = nullptr, *next;
while(head){
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
};