LeetCode 234. 迴文連結串列
阿新 • • 發佈:2019-01-31
題目描述:
請判斷一個連結串列是否為迴文連結串列。
示例 1:
輸入: 1->2 輸出: false
示例 2:
輸入: 1->2->2->1 輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
思路:
這道題採用的是O(n) 時間複雜度和 O(1) 空間複雜度,但是缺點是會修改連結串列的結構。我們可以先找到連結串列中間的位置,然後把連結串列後面的結構修改成倒序,然後從連結串列頭和連結串列尾部逐漸向中間訪問
程式碼:
/** * 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) { //O(n) 時間複雜度和 O(1) 空間複雜度,但是缺點是會修改連結串列的結構 if(head == nullptr || head->next == nullptr) return true; ListNode* pslow = head, *pfast = head; while(pfast->next){ pslow = pslow->next; pfast = pfast->next->next; if(pfast == nullptr) break; } //此時的pslow在連結串列中間的位置 ListNode* pre = pslow, *temp = nullptr; pslow = pslow->next; pre->next = nullptr; while(pslow){ temp = pslow->next; pslow->next = pre; pre = pslow; pslow = temp; } ListNode* first = head, *end = pre; while(first != end){ if(first->next == end){ if(first->val == end->val) return true; else return false; } if(first->val == end->val){ first = first->next; end = end->next; } else{ return false; } } return true; } };