zoukankan      html  css  js  c++  java
  • 回文链表 牛客网 程序员面试金典 C++ Python

    回文链表 牛客网 程序员面试金典  C++ Python

    • 题目描述
    • 请编写一个函数,检查链表是否为回文。
    • 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
    • 测试样例:
    • {1,2,3,2,1}
    • 返回:true
    • {1,2,3,2,3}
    • 返回:false
    class Palindrome {
    public:
    // run:4ms memory:492k
         bool isPalindrome(ListNode* pHead) {
            if(NULL == pHead) return true;
            if(NULL == pHead->next) return true;
            if(NULL == pHead->next->next)
                if(pHead->val == pHead->next->val) return true;
                else return false;
            bool ret = true;
            ListNode* lastNode = NULL;
            ListNode* nextNode = pHead->next;
            ListNode* pSlow = pHead;
            ListNode* pFast = pHead;
            while(pFast && pFast->next){
                pFast = pFast->next->next;
                pSlow->next = lastNode;
                lastNode = pSlow;
                pSlow = nextNode;
                nextNode = nextNode->next;
            }
            ListNode* lNode = lastNode;
            ListNode* nNode = pSlow;
            if (NULL == pFast)
                if (pSlow->val != lastNode->val) ret = false;
                else lastNode = lastNode->next;
            while(lastNode){
                if (lastNode->val != nextNode->val) {
                    ret =  false;
                    break;
                }
    
                lastNode = lastNode->next;
                nextNode = nextNode->next;
            }
            while(lNode){
                ListNode* tmp = lNode->next;
                lNode->next = nNode;
                nNode = lNode;
                lNode = tmp;
            }
            return ret;
        }
    
    // run:5ms memory:600k
        bool isPalindrome2(ListNode* pHead) {
            if(NULL == pHead) return true;
            if(NULL == pHead->next) return true;
            if(NULL == pHead->next->next)
                if(pHead->val == pHead->next->val) return true;
                else return false;
            ListNode* lastNode = NULL;
            ListNode* nextNode = pHead->next;
            ListNode* pSlow = pHead;
            ListNode* pFast = pHead;
            while(pFast && pFast->next){
                pFast = pFast->next->next;
                pSlow->next = lastNode;
                lastNode = pSlow;
                pSlow = nextNode;
                nextNode = nextNode->next;
            }
            if (NULL == pFast)
                if (pSlow->val != lastNode->val) return false;
                else lastNode = lastNode->next;
            while(lastNode){
                if (lastNode->val != nextNode->val) return false;
                lastNode = lastNode->next;
                nextNode = nextNode->next;
            }
            return true;
        }
    
    // run:4ms memory:476k
        bool isPalindrome3(ListNode* pHead) {
            if(NULL == pHead) return true;
            if(NULL == pHead->next) return true;
            if(NULL == pHead->next->next)
                if(pHead->val == pHead->next->val)
                    return true;
                else return false;
            ListNode* lastNode = NULL;
            ListNode* nextNode = pHead->next;
            ListNode* pSlow = pHead;
            ListNode* pFast = pHead;
            while(pFast && pFast->next){
                pFast = pFast->next->next;
                pSlow->next = lastNode;
                lastNode = pSlow;
                pSlow = nextNode;
                nextNode = nextNode->next;
            }
            if (NULL == pFast){
                if (pSlow->val != lastNode->val)
                    return false;
                else{
                    lastNode = lastNode->next;
                    while(lastNode){
                        if (lastNode->val != nextNode->val)
                            return false;
                        lastNode = lastNode->next;
                        nextNode = nextNode->next;
                    }
                }
            }
            if(NULL == pFast->next){
                   while(lastNode){
                        if (lastNode->val != nextNode->val)
                            return false;
                        lastNode = lastNode->next;
                        nextNode = nextNode->next;
                    }
            }
            return true;
        }
    };
    

    Python

    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Palindrome:
    # run:43ms memory:5732k
        def isPalindrome(self, pHead):
            if None == pHead: return True
            if None == pHead.next: return True
            if None == pHead.next.next:
                if pHead.val == pHead.next.val: return True
                else: return False
            ret = True
            lastNode = None
            nextNode = pHead
            pFast = pHead
            pSlow = pHead
            while pFast and pFast.next:
                pFast = pFast.next.next
                nextNode = pSlow.next
                pSlow.next = lastNode
                lastNode = pSlow
                pSlow = nextNode
                nextNode = nextNode.next
            lNode = lastNode
            nNode = pSlow
            if None == pFast:
                if pSlow.val != lastNode.val:ret = False
                else:lastNode = lastNode.next
            while lastNode and nextNode:
                if lastNode.val != nextNode.val:
                    ret = False
                lastNode = lastNode.next
                nextNode = nextNode.next
            while lNode:
                tmp = lNode.next
                lNode.next = nNode
                nNode = lNode
                lNode = tmp
            return ret
    
    # run:34ms memory:5728k
        def isPalindrome2(self, pHead):
            if None == pHead: return True
            if None == pHead.next: return True
            if None == pHead.next.next:
                if pHead.val == pHead.next.val: return True
                else: return False
            lastNode = None
            nextNode = pHead
            pFast = pHead
            pSlow = pHead
            while pFast and pFast.next:
                pFast = pFast.next.next
                nextNode = pSlow.next
                pSlow.next = lastNode
                lastNode = pSlow
                pSlow = nextNode
                nextNode = nextNode.next
            if None == pFast:
                if pSlow.val != lastNode.val:return False
                else:lastNode = lastNode.next
            while lastNode:
                if lastNode.val != nextNode.val:return False
                lastNode = lastNode.next
                nextNode = nextNode.next
            return True
  • 相关阅读:
    Conda 使用笔记
    个人日志笔记软件比较
    CMD 命令笔记
    Joplin 资源汇总
    【NAS】Hexo+Github 搭建博客&基础配置
    【NAS】群晖 WordPress 使用记录
    哈工大计组mooc 第四章 中 测试
    下列软件包有未满足的依赖关系:
    安装ubuntu用Ultraiso制作引导盘便捷启动提示:找到多余一个分区
    ros安装caffe anaconda2之后roscore无法执行
  • 原文地址:https://www.cnblogs.com/vercont/p/10210327.html
Copyright © 2011-2022 走看看