請判斷一個鏈表是否爲迴文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
因爲上述要求,就參考了一下評論
主要需要記住 nullptr (C++中空指針類型的關鍵字)、快慢指針、反轉鏈表
/**
* 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) {
ListNode *slow = head, *fast = head, *prev=nullptr; //nullptr C++中空指針類型的關鍵字
while(fast){//find mid node
slow = slow->next;
fast = fast->next ? fast->next->next: fast->next;
}
while(slow){//reverse
ListNode* ovn = slow->next;//保存next
slow->next = prev; //目前的slow加入到prev之前
prev = slow; //prev指向現在的開頭
slow = ovn; //slow往下
}
while (head && prev){//check
if (head->val != prev->val){
return false;
}
head = head->next;
prev = prev->next;
}
return true;
}
};