lc hot 100之:回文链表
我觉得这题是很经典,用到了两个很重要的链表算法【反转链表】和【找中点】。这两个算法用到的很多,大家写链表题的时候也可以从这两个开始想。
思路是:反转后半段链表,这样得到两个链表,双指针分别遍历这两个链表是否相同。
代码:
class Solution {
public:ListNode* reverse(ListNode* head){ListNode* pre=nullptr;ListNode* cur=head;while(cur!=nullptr){ListNode* nxt=cur->next;cur->next=pre;pre=cur;cur=nxt;}return pre;} ListNode* findMiddle(ListNode* head){ListNode* slow=head;ListNode* fast=head;while(fast->next&&fast->next->next){fast=fast->next->next;slow=slow->next;}return slow;}bool isPalindrome(ListNode* head) {ListNode* middle=findMiddle(head);ListNode* head2=reverse(middle);//后半段翻转while(head&&head2){if(head->val!=head2->val)return false;head=head->next;head2=head2->next;}return true;}
};
其实对于 【反转链表】和【找中点】这两个算法,也能讲解很多。对于初学者来说这两个算法很难想到,建议多写几遍,体会一下链表与数组不同的处理步骤。
简单说一下这两个算法吧:
【反转链表】其实是之前提到的【三指针】:pre,cur,next。要多想象画图理解一下。
【找重点】也是之前提到的【快慢双指针】思想,让快指针跑两倍速,这样他到终点时慢指针正好到中间~
加油加油!今天是525嘻嘻嘻!!!大家一起加油!!