美文网首页
单链表判定回文

单链表判定回文

作者: 小幸运Q | 来源:发表于2021-04-12 19:26 被阅读0次

方法一 (后序递归+全局left指针,递归内right指针) ,时间复杂度O(n),空间复杂度O(n)

利用后序递归+全局left指针,递归里面只要判断right是否==left。(left与right无法判断相对位置关系)

class Solution {
public:
    ListNode * p;
    bool helper(ListNode*root){
        if(root==nullptr){
            return true;
        }
        bool b=helper(root->next);
        if(b==true&&root->val==p->val){
            p=p->next;
            return true;
        }
        return false;
    }
    bool isPalindrome(ListNode* head) {
        if(head==nullptr){
            return true;
        }
        p=head;
        return helper(head);
    }
};

方法二 (快慢指针+翻转), O(n)时间复杂度 O()

通过快慢指针得到中间点,从需要匹配的右侧串翻转,然后逐个匹配。

1->2->3->4 => 1->2-> | 3<-4

class Solution {
public:
    ListNode* helper(ListNode*&head){
        // 翻转
        if(head->next==nullptr){
            return head; 
        }
        ListNode* root = helper(head->next);
        head->next->next=head;
        head->next=nullptr;
        return root;
    }
    bool isPalindrome(ListNode* head) {
        if(head==nullptr){
            return true;
        }
        ListNode* pre=head;
        ListNode* next=head;
        int counts=0;
        while(next->next!=nullptr && next->next->next!=nullptr){
            pre=pre->next;
            next=next->next->next;
            counts++;
            // 0-(1)-(2)
            // 0-(1)-(2)-3
            // 0-1-(2)-3-(4)
        }
        if(next->next==nullptr){
            // odd
        }
        else{
            // even
            counts++;
            pre=pre->next;
        }
        ListNode* rev=helper(pre);
        for(int i=0;i<counts;i++){
            if(rev->val!=head->val){
                return false;
            }
            rev=rev->next;
            head=head->next;
        }
        return true;
    }
};

相关文章

  • 单链表判定回文

    方法一 (后序递归+全局left指针,递归内right指针) ,时间复杂度O(n),空间复杂度O(n) 利用后序递...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 回文链表判断(leetcode234)

    题目 给定一个链表,判定它是否是回文链表 举例:1->2返回false 1->2->2->1返回true 时间复杂...

  • 初级算法-链表-回文链表

    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false...

  • 234. 回文链表

    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false...

  • Python编程题47--回文链表

    题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 True ;否则,返回 Fa...

  • 回文链表 2022-03-05 周六

    题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 fa...

  • Swift - LeetCode - 回文链表

    题目 给你一个单链表的头节点 head,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 fals...

  • 算法题解:判断链表是否为回文链表

    大家好,我是前端西瓜哥,今天来做一道算法题。 给一个单链表,判断是否为回文链表。 所谓回文,就是左右值对称相同的链...

  • 【日拱一卒】链表——回文判断

    需求 判断一个链表是否是回文链表 回文的形式大家应该都知道,类似 这种对称的方式都是回文。 难点 如果将链表形式换...

网友评论

      本文标题:单链表判定回文

      本文链接:https://www.haomeiwen.com/subject/nxvxlltx.html