给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
img
1 2
| 输入:head = [1,2,2,1] 输出:true
|
示例 2:
img
1 2
| 输入:head = [1,2] 输出:false
|
提示:
- 链表中节点数目在范围
[1, 105]
内
0 <= Node.val <= 9
进阶:你能否用 O(n)
时间复杂度和
O(1)
空间复杂度解决此题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
class Solution { public: bool isPalindrome(ListNode* head) { ListNode* slow, *fast; slow = fast = head; while(fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; }
if(fast != nullptr) { slow = slow->next; }
ListNode* left = head; ListNode* right = reverse(slow); while(right != nullptr) { if(left->val != right->val) { return false; } left = left->next; right = right->next; } return true; }
ListNode* reverse(ListNode* head) { ListNode* pre = nullptr, *cur = head; while(cur != nullptr) { ListNode* next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; } };
|