这道题目笔记简单。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
stack<int> in_order;
ListNode *tmp = head;
while(tmp != NULL)
{
in_order.push(tmp->val);
tmp = tmp->next;
}
tmp = head;
while(tmp != NULL)
{
int tmp_q = in_order.top();
in_order.pop();
if(tmp_q != tmp->val)
return false;
tmp = tmp->next;
}
return true;
}
};
我看到一个很不错的解法,它居然用两个指针计算中点:
bool isPalindrome(ListNode* head) {
if (!head || !head->next) return true;
ListNode* slow = head;
ListNode* fast = head->next;
//find midlle of the list
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
//revert the list
ListNode* prev = slow;
ListNode* p = slow->next;
slow->next = nullptr;
while (p)
{
ListNode* tmp = p->next;
p->next = prev;
prev = p;
p = tmp;
}
//judge is palindrome
ListNode* l = head;
ListNode* r = prev;
while (l && r)
{
if (l->val != r->val)
return false;
l = l->next;
r = r->next;
}
return true;
}