请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
非进阶做法简直easy;
进阶解析:翻转后一半,如果奇数,翻转后面(n-1)/2个元素,具体翻转利用前面的翻转算法,不影响空间复杂度,时间复杂度并列n。然后从head位置和1/2链表位置开始一起往后走,一样就->next不一样立马return false;
这里用了一个计算链表长度函数,时间On,空间O1。也可以用双指针法,就能找到中间指针;
代码如下:
class Solution {
public:
bool isPalindrome(ListNode* head) {
int n=len(head);
if(n==1)return true;
ListNode*head2=head;
for(int i=0;i<(n/2+n%2);i++){
head2=head2->next;
}
head2=reverseList(head2);
while(head2!=NULL){
if(head->val!=head2->val) return false;
else{head=head->next;head2=head2->next;}
}
return true;
}
int len(ListNode*head){
int n=0;
while(head!=NULL){
head=head->next;
++n;
}
return n;
}
ListNode* reverseList(ListNode* head) {
ListNode*pt=head;
ListNode*temp;
if(pt==NULL) return head;
while(pt->next!=NULL){
temp=pt->next;
pt->next=pt->next->next;
temp->next=head;
head=temp;
}
return head;
}
};