234. 回文链表
1.快慢指针
-
还有同样应用快慢指针的场景,可以一起完成:
-
移除元素:26. 删除有序数组中的重复项
-
判断链表中是否有环:141. 环形链表
题解:141. 环形链表题解
-
判断链表是否是回文链表:234. 回文链表
-
移除元素:27. 移除元素
-
-
本题可以使用笨办法,根据题解中提到的转换成数组判断是否是回文,是可以达到要求的。在这里记录一种很巧妙的方法:快慢指针,只需要一次遍历,不需要额外空间完成判断。
-
快指针比慢指针多走一步,走到末尾时,慢指针恰好在链表中间。在慢指针前进过程中,我们就将慢指针走过的前半部分原地反转,并记录一个前半部分的头节点。此时,只需要再遍历半次,判断分开的前后两个链表是否相等即可。
class Solution { public: bool isPalindrome(ListNode* head) { ListNode* List1;//前半部分的头节点 ListNode* List1_pre=nullptr;//前半部分头节点的前一个节点,用于原地反转,初始为空 ListNode* fast=head; ListNode* slow=head; while(fast!=nullptr&&fast->next!=nullptr){ List1=slow; slow=slow->next; fast=fast->next->next;//更新快慢指针 List1->next=List1_pre;//反转前半部分 List1_pre=List1; } if(fast!=nullptr){ slow=slow->next;//此时链表有奇数个元素,slow指向最中间那个元素,把它跳过不比较 } while(List1&&slow){ if(List1->val!=slow->val){ return false; } List1=List1->next; slow=slow->next; } return true; } };