Given a singly linked list, determine if it is a palindrome.
利用之前完成的link 翻转。首先找到中间节点,然后对后半link翻转和前半段对比。如果一样说明link是回文。
/**
* 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) {
if(head == NULL||head->next == NULL);
return true;
ListNode *fast = head;
ListNode *slow = head;
ListNode *head1 = head;
while(fast->next&&fast->next->next){
fast = fast->next->next;
slow = slow->next;
}
ListNode *temp = reverseList(slow->next);//翻转后半段link
while(temp){
if(head1->val != temp->val){
return false;
}
head1 = head1->next;
temp = temp->next;
} //对比
return true;
}
ListNode* reverseList(ListNode* head) {
if(head==NULL)
return NULL;
ListNode* pre = new ListNode(-1);
pre->next = head;
ListNode* cur = head;
ListNode* nex = head;
while(cur->next){
nex = cur->next;
cur->next = nex->next;
nex->next = pre->next;
pre->next = nex;
}
return pre->next;
}
};