题目:回文链表
使用的是双指针,以及上面那一题的反转函数
一种比较粗暴的方法是将链表转换成数组,之后再使用双指针从两边向中间遍历比较,但是这个方法的空间复杂度是O(n)
下面这个方法的思路是:找出链表的中点,翻转后半部分,再指定两个指针,分别从首节点与中间节点的后一个节点开始,向后进行遍历比较
那么问题就变成了如何找到链表的中点:
首先定义两个指针:slow指针和fast指针
slow初始指向head,fast初始指向head->next,之后进行循环,slow每次向后移动一位,fast则移动两位,直到fast的下一个节点为空(偶数链表)或fast本身为空(奇数链表),此时可以判断—-slow指向的节点就是前半部分链表的最后一个节点
之后对slow后面的另一半链表进行翻转,再逐个比较即可
1ListNode* reverse(ListNode* curr, ListNode* prev)
2 {
3 if(curr == nullptr) return prev;
4 ListNode* temp = curr->next;
5 curr->next = prev;
6 return reverse(temp, curr);
7 }
8
9 bool isPalindrome(ListNode* head)
10 {
11 ListNode* slow = head;
12 ListNode* fast = head->next;
13 int half = 1;
14
15 while(fast && fast->next)
16 {
17 slow = slow->next;
18 fast = fast->next->next;
19 half++;
20 }
21
22 slow = reverse(slow, nullptr);
23 for(int i = 0; i < half; i++)
24 {
25 if(head->val != slow->val) return false;
26 head = head->next;
27 slow = slow->next;
28 }
29 return true;
30 }