请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
基本思路:在O(1)的空间复杂度上,必须修改链表结构,选择了后半部分反转。
bool isPalindrome(ListNode* head) {
int count=0;
ListNode *cur=head;
while(cur){
count++;
cur=cur->next;
}
if(count<2)
return true;
ListNode* post_head=head;
for(int i=0;i<(count+1)/2;i++){
post_head=post_head->next;
}
cout<<post_head->val<<endl;
ListNode *new_postHead=reverseList(post_head);
cout<<new_postHead->val<<endl;
cur=head;
for(int i=0;i<count/2;i++){
if(new_postHead->val!=cur->val)
return false;
new_postHead=new_postHead->next;
cur=cur->next;
}
return true;
}
ListNode *reverseList(ListNode *head){
if(head->next==nullptr)
return head;
ListNode *temp;
ListNode *pre=head;
ListNode *cur=head->next;
head->next=nullptr;
while(cur){
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
改进:忘记可以使用快慢指针,以及为何不反转前半部分?
bool isPalindrome(ListNode* head) {
if(head==nullptr||head->next==nullptr){
return true;
}
ListNode *slow=head,*fast=head;
ListNode *cur=head,*pre=nullptr;
while(fast!=nullptr&&fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
cur->next=pre;//反转
pre=cur;
cur=slow;
}
if(fast){
slow=slow->next;
}
while(slow!=nullptr){
if(slow->val!=pre->val)
return false;
pre=pre->next;
slow=slow->next;
}
return true;
}