使用快慢指針,當快指針到達表尾的時候,慢指針在鏈表中部,將鏈表的後半部分進行倒置,與前半部分進行比較,相等則爲迴文鏈表。
鏈表的倒置部分:例如1>2>3>4>3>2>1
相當於是pre(前節點)>slow(當前節點)>next(下個節點)三個指針在鏈表上滑動,開始的時候,slow指向4這個節點,pre 開始指向爲NULL;
1、用新指針p保存每一次slow的下個節點(p = slow -> next);
2、要實現鏈表的反轉,就是要實現pre<slow這個步驟,所以將slow指向pre(slow -> next = pre);
3、一次反轉完成後將指針向右滑動,pre = slow(slow成爲了前節點);
4、slow = p(此時的p成爲了當前節點);
循環以上步驟,直到slow = NULL,pre剛好指向鏈表的最後一個節點,實現了所有鏈表的反轉。
bool isPalindrome(struct ListNode* head){
struct ListNode* fast = head;
struct ListNode* slow = head;
struct ListNode* pre = NULL;
if(!head || !head->next)
return true;
while(fast && fast->next){ //快慢指針移動
fast = fast->next->next;
slow = slow->next;
}
while(slow){ //鏈表倒置
struct ListNode *p
p = slow->next;
slow->next = pre;
pre = slow;
slow = p;
}
while(pre && head){ //比較
if(pre->val != head->val)
return false;
pre = pre->next;
head = head->next;
}
return true;
}