Leetcode.234 回文链表
题目
请判断一个链表是否为回文链表
输入: 1->2 输出: false
输入: 1->2->2->1 输出: true
代码
1 class Solution { 2 public: 3 bool isPalindrome(ListNode* head) { 4 if(head == NULL || head->next == NULL) return true; 5 //快慢指针用来寻找中间节点 6 ListNode* fast = head; 7 ListNode* slow = head; 8 9 //找到中间节点 10 while(fast && fast->next){ 11 slow = slow->next; 12 fast = fast->next->next; 13 } 14 15 //反转链表 16 ListNode* pre = slow; ListNode* cur = slow->next; 17 while(cur != NULL){ 18 ListNode* tmp = cur->next; 19 cur->next = pre; 20 pre = cur; 21 cur = tmp; 22 } 23 //结束后pre就到了尾节点 24 25 slow->next = NULL; 26 while(head && pre){ 27 if(head->val != pre->val) return false; 28 head = head->next; 29 pre = pre->next; 30 } 31 return true; 32 33 } 34 };
时间复杂度O(n),空间复杂度O(1)
总结
1.在未知链表长度的情况下,如何在时间复杂度O(n)下寻找链表中间节点 ? 采用快慢指针(太秀了)
2.回文链表问题可以看成
(1)寻找链表中间节点
(2)后半部分链表逆置
(3)前后两部分进行比较
3.第四行开头空链表或者只含一个元素的链表的情况需要判断,否则下面赋值slow,可能为空(6行)