当前位置: 首页 > article >正文

C++速通LeetCode第5题-回文链表

 

 解法1,堆栈O(n)简单法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        stack<int> s;
        ListNode* cp = head;
        bool flag = true;
        while(cp!=nullptr)
        {
            s.push(cp->val);
            cp = cp->next;
        }
        while(head!=nullptr)
        {
            if(s.top()!=head->val)
            {
                return false;
            }
            else
            {
                s.pop();
                head = head->next;
            }
        }
        return true;
    }
};

解法2, 快慢指针确定中间节点并向后逆序O(1):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //找到开始逆序的中间节点slow
    ListNode* MiddleNode(ListNode* ori)
    {
        ListNode* countTest = ori;
        ListNode* middleStart = nullptr;
        while(countTest!=nullptr)
        {
            countTest = countTest->next;
        }
        ListNode* fast = ori;
        ListNode* slow = ori;
        
        //奇数偶数一样
        while(fast != nullptr && fast->next!= nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;
        }
        middleStart = slow;
        return middleStart;
    }

    //从slow的中间节点开始逆序,返回逆序后半序列的头节点
    ListNode* ReverseNode(ListNode* start)
    {
        ListNode* pre = nullptr;
        ListNode* cur = start;

        while(cur != nullptr)
        {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

    bool isPalindrome(ListNode* head) {
        ListNode* rev = ReverseNode(MiddleNode(head));
        while(rev!=nullptr)
        {
            if(rev->val!=head->val)
            {
                return false;
            }
            else
            {
            head = head->next;
            rev = rev->next;
            }
        }
        return true;
    }
};


http://www.kler.cn/news/302508.html

相关文章:

  • 防止文件外发泄密有什么方法?这7防外发方式可以看下!
  • 数字化转型背景下低代码开发模式变革的研究
  • Excel图表生成:自动化创建与修改Excel图表的技术指南
  • 基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
  • pytorch torch.triu函数介绍
  • python实现进化算法
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.4】RK3588网络摄像头推理后推流到RTSP更多内容见视频
  • 海思SD3403(21AP10, 108DC2910 )4K60 的 ISP 图像处理能力,4Tops INT8算力
  • 数据结构2 :双向链表和内核链表
  • mysql可重复读不能解决幻读吗?
  • linux————根据端口查找运行目录的三种方法
  • STM32内部闪存FLASH(内部ROM)、IAP
  • 信息安全工程师题
  • ASR(自动语音识别)识别文本效果的打分总结
  • 用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群
  • 【docker】了解什么是Docker
  • 欧洲麻花钻市场主要企业市场占有率及排名
  • Framework | 在Android中运行时获取顶层Activity并处理业务逻辑
  • 【测试】——自动化测试入门(Selenium环境搭建)
  • Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串
  • IPC$漏洞多位密码爆破方法
  • 揭开Facebook AI的神秘面纱:如何利用人工智能提升社交体验
  • Java笔试面试题AI答之单元测试JUnit(4)
  • 亚信安全出席第五届国际反病毒大会 探究AI现代网络勒索治理
  • SprinBoot+Vue爱老助老服务平台的设计与实现
  • JAVAEE初阶第六节——网络编程套接字
  • 通信工程学习:什么是SLF签约数据定位功能
  • 携手科大讯飞丨云衔科技为企业提供全栈AI技术解决方案
  • yolov8学习笔记
  • 深入理解Java中的Lambda表达式