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)前后两部分进行比较

猜你喜欢

转载自www.cnblogs.com/fresh-coder/p/13376836.html
今日推荐