题意:给定一个单链表,问该单链表是否是回文单链表
要求:时间复杂度O(n),空间复杂度O(1)
题解:首先取单链表中间结点,将原单链表分成两部分,然后将后边一半逆置,再将两个链表一一对比,看看元素是否相等。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* midNode(ListNode* p){
ListNode* fast=p;
ListNode* slow=p;
while(fast->next!=NULL&&fast->next->next!=NULL){
//奇数时指向中间,偶数时指向中间偏右那个
fast=fast->next->next;
slow=slow->next;
}
fast=slow->next;
slow->next=NULL;
return fast;
}
ListNode* reverseNode(ListNode* p){
ListNode* current;
ListNode* pnext;
ListNode* prev;
current=p;
pnext=current->next;
current->next=NULL;
while(pnext){
prev=pnext->next;
pnext->next=current;
current=pnext;
pnext=prev;
}
p=current;
return p;
}
bool isPalindrome(ListNode* head) {
if(head==NULL||head->next==NULL){
return true;
}
//先找出中间那个数
ListNode* mid=midNode(head);
mid=reverseNode(mid);
ListNode* cur=head;
while(cur!=NULL&&mid!=NULL){
if(cur->val!=mid->val)
return false;
cur=cur->next;
mid=mid->next;
}
return true;
}
};