请判断一个链表是否为回文链表。
示例 1: 输入: 1->2 输出: false
示例 2: 输入: 1->2->2->1 输出: true
思路
1.用快慢指针,快指针有两步,慢指针走一步,快指针遇到终止位置时,慢指针就在链表中间位置 2.同时用pre记录慢指针指向节点的前一个节点,用来分割链表 3.将链表分为前后均等两部分,如果链表长度是奇数,那么后半部分多一个节点 4.将后半部分反转 ,得cur2,前半部分为cur1 5.按照cur1的长度,一次比较cur1和cur2的节点数值
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==nullptr||head->next==nullptr)
return true;
ListNode* fast=head;
ListNode* slow=head;
ListNode* pre=head;
while(fast&&fast->next){
pre=slow;
fast=fast->next->next;
slow=slow->next;
}
pre->next=nullptr;
ListNode* cur1=head;
ListNode* cur2=reverse(slow);
while(cur1){
if(cur1->val!=cur2->val)
return false;
cur1=cur1->next;
cur2=cur2->next;
}
return true;
}
ListNode* reverse(ListNode* head){
ListNode* temp;
ListNode* cur=head;
ListNode* pre=nullptr;
while(cur){
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};
|