本题源自leetcode 234
-------------------------------------
思路 : 1 找到链表的中间节点。然后反转中间节点后的链表。然后与前半部分比较。
代码:
bool isPalindrome(ListNode* head) {
if(head == NULL || head->next == NULL)
return true;
ListNode* slow = head;
ListNode* fast = head;
while(fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
slow->next = reverseList(slow->next);
slow = slow->next;
while(slow){
if(slow->val != head->val)
return false;
slow = slow->next;
head = head->next;
}
return true;
}
ListNode* reverseList(ListNode* root){
if(root == NULL)
return root;
ListNode* p = root;
ListNode* pre = NULL;
ListNode* pNext = NULL;
while(p){
pNext = p->next;
p->next = pre;
pre = p;
p = pNext;
}
return pre;
}
递归:
代码:
ListNode* tmp;
bool isPalindrome(ListNode* head) {
tmp = head;
return check(head);
}
bool check(ListNode* root){
if(root == NULL)
return true;
bool res = check(root->next) & (tmp->val == root->val);
tmp = tmp->next;
return res;
}