234. 回文链表c++

请判断一个链表是否为回文链表。

示例 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;
    }
};

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/82384660