class Solution {
public:
ListNode* reverse(ListNode* head){
ListNode *fast = head;
ListNode *slow = head;
while(fast&& fast->next){ //fast !=NULL: odd node case; fast->next != NULL: even node case
fast = fast->next->next;
slow = slow->next;
}
ListNode *store = new ListNode(0);
store->next = head;
ListNode *temp = head, *cur = head->next;
//step1: store next node of current node using a temp list
//step2: reverse the current node
//step3: sent the next node to the current node to do the next iteration unitl all nodes are done
while(cur != slow){
temp->next = cur->next;
cur->next = store->next;
store->next = cur;
cur = temp->next;
}
return store->next;
}
bool isPalindrome(ListNode* head) {
int len = 0;
ListNode* p = head;
while(p){
len++;
p = p->next;
}
if(len < 2) return true;
ListNode* reversedHalf = reverse(head);
ListNode *fast = reversedHalf, *slow = reversedHalf;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
}
fast = reversedHalf;
if(len % 2){ //if node number is even,
//slow should shift to the first node of the second half part in the overall list
slow = slow->next;
}
while(slow){
if(fast->val != slow->val) return false;
fast = fast->next;
slow = slow->next;
}
return true;
}
};
以上是AC代码
主要是方法还是双指针法
两次利用双指针法:
(1),翻转前一半节点
(2),两个指针分别指向头结点和中间节点,以此比较各个节点的值
注意:总结点个数为偶数时的情况